Application.ProcessMessages 在 TThread 中?
Application.ProcessMessages in a TThread?
在线程(不是主线程)内调用 Application.Processmessages
是否“可以”,还是我应该预料到麻烦?
TApplication.ProcessMessages()
主要用于处理 VCL 消息。您不应该在工作线程中接收任何 VCL 消息,除非您正在从工作线程创建和显示 TForm
windows。你不应该这样做,因为 VCL 不是线程安全的,不应该在主线程之外使用 UI。
但是,话虽这么说,如果在工作线程中没有收到 VCL 消息,在工作线程中调用 ProcessMessages()
本身并无害处。它会将任何接收到的消息(VCL 或其他)分派到调用线程中适当的 window 过程。但是,如果您认为您需要在工作线程中手动分发消息,您真的需要首先质疑为什么需要它。除非您在工作线程中使用 COM 单元线程对象,或者将自定义线程消息发布到工作线程,否则 运行 工作线程中的消息循环几乎没有用处,即使那样 ProcessMessages()
不适合这个目的。
从主线程以外的线程调用 Application.ProcessMessages
确实是个坏主意,因为它实际上是针对 VCL 而 VCL 不是线程安全的。
话虽如此,我有很多线程都具有 message loop
以便它处理协作式多任务处理和线程间通信。
我总是通过调用 Windows API:
来编写自己的消息循环
while GetMessage(MsgRec, 0, 0, 0) do begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec)
end;
当异步 TWSocket 必须在线程中 运行 时,我在我的 ICS(Internet 组件套件)中大量使用了它。上面的代码是TIcsWndControl中ICS的一部分。 TWSocket 每个线程可以轻松处理数百个连接,但如果要处理数千个连接,则必须使用线程。
在工作线程或主线程和工作线程之间使用Windows消息通常是避免调用TThread.Synchronize
的解决方案:当你从一个线程PostMessage时,发送线程继续运行 和接收线程(创建在 PostMessage 中传递的 window 句柄的线程)将在他自己的上下文中优雅地处理消息。
在线程(不是主线程)内调用 Application.Processmessages
是否“可以”,还是我应该预料到麻烦?
TApplication.ProcessMessages()
主要用于处理 VCL 消息。您不应该在工作线程中接收任何 VCL 消息,除非您正在从工作线程创建和显示 TForm
windows。你不应该这样做,因为 VCL 不是线程安全的,不应该在主线程之外使用 UI。
但是,话虽这么说,如果在工作线程中没有收到 VCL 消息,在工作线程中调用 ProcessMessages()
本身并无害处。它会将任何接收到的消息(VCL 或其他)分派到调用线程中适当的 window 过程。但是,如果您认为您需要在工作线程中手动分发消息,您真的需要首先质疑为什么需要它。除非您在工作线程中使用 COM 单元线程对象,或者将自定义线程消息发布到工作线程,否则 运行 工作线程中的消息循环几乎没有用处,即使那样 ProcessMessages()
不适合这个目的。
从主线程以外的线程调用 Application.ProcessMessages
确实是个坏主意,因为它实际上是针对 VCL 而 VCL 不是线程安全的。
话虽如此,我有很多线程都具有 message loop
以便它处理协作式多任务处理和线程间通信。
我总是通过调用 Windows API:
来编写自己的消息循环while GetMessage(MsgRec, 0, 0, 0) do begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec)
end;
当异步 TWSocket 必须在线程中 运行 时,我在我的 ICS(Internet 组件套件)中大量使用了它。上面的代码是TIcsWndControl中ICS的一部分。 TWSocket 每个线程可以轻松处理数百个连接,但如果要处理数千个连接,则必须使用线程。
在工作线程或主线程和工作线程之间使用Windows消息通常是避免调用TThread.Synchronize
的解决方案:当你从一个线程PostMessage时,发送线程继续运行 和接收线程(创建在 PostMessage 中传递的 window 句柄的线程)将在他自己的上下文中优雅地处理消息。