Application.DoEvents() 是多任务处理的一种形式吗?
Is Application.DoEvents() a form of Multitasking?
我非常确定 Applicataion.DoEvents() 在 Windows 表格中。是一种非常早期、非常原始的 WindowsForms only 形式的多任务处理。它具有所有的指示器和机制:
- 正在暂停调用事件的执行。
- 让上述事件的其余部分成为 运行 之后的延续。
- 允许另一个 Events/Processes 到 运行。只是有一些额外的问题,因为 MT 是通过 EventQueue 实现的。甚至可能是对队列的递归调用。
但我只是 运行 变成了一个 坚持 它有 "nothing to do with Multitasking" 的人,这与我对功能或多任务处理的理解不一致.
注意:我明确认为 Mutltithreading 只是 Multitasking 的一个实现。很明显DoEvents()
不是Multithreading的一种形式,大家都知道how poorly that one works in GUI Environments.
嗯,这叫做抢占式多任务处理,意思是 "interrupting a task"。您执行多个任务,但绝不会同时执行两个任务。它不是关于使用 CPU 的多个核心,而是一种控制程序内部多个活动的方法。
Common Sample 是,为了让程序有机会处理用户的鼠标移动,同时进行冗长的操作,运行ning 可以被视为 "batch"-job 的东西。
一般不用关心这个"DoEvents",但是如果你知道,你有一个过程运行ning超过1秒,你应该手动调用它,你通过因此,将控件转移到另一种方法,您停止自己的代码,让其他代码 运行,然后继续您自己的代码。
所以它永远不会异步,但仍然是某种 "multitasking".
它更像是一个控制结构,重要的是,你不知道里面发生了什么,你称它为 "just for case" - 其他人可能需要 CPU 一毫秒。
没有外部任务调度程序会中断您的代码并进行上下文切换,如果您做一些冗长的事情,您必须 "behave" 自己中断您的代码。按照惯例,您只能在事件处理程序中做 "small" 事情,并尽快 return 控制到 Windows,要么通过完成方法,要么通过调用 DoEvents。
I am pretty sure it is a very early, very primitive, Windows Forms only form of Multitasking
除了您推测它仅适用于 WinForms 之外,您在所有方面都非常接近正确。 "DoEvents" 在 WinForms 之前;它早在 WinForms 发明之前就存在于 Visual Basic 中,并且 "pump the message queue" 显然也先于 VB。这是一个坏主意,而且很容易被滥用。
Making the rest of said Event a continuation to be run later.
DoEvents 并没有真正像 await
那样将任何东西变成延续。当调用 DoEvents 时,当前 "in flight" 的任何事件都在堆栈上具有其状态,并且在这种情况下,堆栈是延续的实现。这是反对 DoEvents 的另一点——与 await
不同,它会占用堆栈,因此会导致溢出。
I just ran into a poster that insists it has "nothing to do with Multitasking".
那你应该问作者澄清一下,因为这听起来肯定是错误的。
我非常确定 Applicataion.DoEvents() 在 Windows 表格中。是一种非常早期、非常原始的 WindowsForms only 形式的多任务处理。它具有所有的指示器和机制:
- 正在暂停调用事件的执行。
- 让上述事件的其余部分成为 运行 之后的延续。
- 允许另一个 Events/Processes 到 运行。只是有一些额外的问题,因为 MT 是通过 EventQueue 实现的。甚至可能是对队列的递归调用。
但我只是 运行 变成了一个 坚持 它有 "nothing to do with Multitasking" 的人,这与我对功能或多任务处理的理解不一致.
注意:我明确认为 Mutltithreading 只是 Multitasking 的一个实现。很明显DoEvents()
不是Multithreading的一种形式,大家都知道how poorly that one works in GUI Environments.
嗯,这叫做抢占式多任务处理,意思是 "interrupting a task"。您执行多个任务,但绝不会同时执行两个任务。它不是关于使用 CPU 的多个核心,而是一种控制程序内部多个活动的方法。 Common Sample 是,为了让程序有机会处理用户的鼠标移动,同时进行冗长的操作,运行ning 可以被视为 "batch"-job 的东西。
一般不用关心这个"DoEvents",但是如果你知道,你有一个过程运行ning超过1秒,你应该手动调用它,你通过因此,将控件转移到另一种方法,您停止自己的代码,让其他代码 运行,然后继续您自己的代码。 所以它永远不会异步,但仍然是某种 "multitasking".
它更像是一个控制结构,重要的是,你不知道里面发生了什么,你称它为 "just for case" - 其他人可能需要 CPU 一毫秒。
没有外部任务调度程序会中断您的代码并进行上下文切换,如果您做一些冗长的事情,您必须 "behave" 自己中断您的代码。按照惯例,您只能在事件处理程序中做 "small" 事情,并尽快 return 控制到 Windows,要么通过完成方法,要么通过调用 DoEvents。
I am pretty sure it is a very early, very primitive, Windows Forms only form of Multitasking
除了您推测它仅适用于 WinForms 之外,您在所有方面都非常接近正确。 "DoEvents" 在 WinForms 之前;它早在 WinForms 发明之前就存在于 Visual Basic 中,并且 "pump the message queue" 显然也先于 VB。这是一个坏主意,而且很容易被滥用。
Making the rest of said Event a continuation to be run later.
DoEvents 并没有真正像 await
那样将任何东西变成延续。当调用 DoEvents 时,当前 "in flight" 的任何事件都在堆栈上具有其状态,并且在这种情况下,堆栈是延续的实现。这是反对 DoEvents 的另一点——与 await
不同,它会占用堆栈,因此会导致溢出。
I just ran into a poster that insists it has "nothing to do with Multitasking".
那你应该问作者澄清一下,因为这听起来肯定是错误的。