在线程(不是Main)中调用Application.Processmessages是"OK“,还是我应该期待遇到麻烦?
发布于 2021-01-19 20:07:50
从另一个线程调用Application.ProcessMessages确实是个坏主意,因为它实际上是针对VCL的,而且VCL并不是线程安全的。
尽管如此,我有很多线程都有一个message loop,因此它可以处理协作多任务和线程间的通信。
我总是通过调用Windows来编写自己的消息循环:
while GetMessage(MsgRec, 0, 0, 0) do begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec)
end;当异步TWSocket必须在线程中运行时,我在ICS ()中大量使用了这一点。上面的代码是TIcsWndControl中ICS的一部分。TWSocket可以轻松地处理每个线程的数百个连接,但是如果您想处理数千个连接,则必须使用线程。
在工作线程或主线程和辅助线程之间使用Windows通常是避免调用TThread.Synchronize的解决方案:当您从线程中调用PostMessage时,发送线程将继续运行,而接收线程(创建在PostMessage中传递的窗口句柄)将在他自己的上下文中优雅地处理消息。
发布于 2021-01-19 19:18:38
TApplication.ProcessMessages()主要用于处理VCL消息。您不应该在工作线程中接收任何VCL消息,除非您正在从工作线程创建和显示TForm窗口。您不应该这样做,因为VCL不是线程安全的,不应该在主UI线程之外使用。
但是,尽管如此,如果在工作线程中没有接收到VCL消息,那么在工作线程中调用ProcessMessages()本身并不有害。它将向调用线程中的适当窗口过程发送任何接收到的消息(VCL或其他消息)。但是,如果您认为您需要在工作线程中手动发送消息,那么首先您需要问一下为什么需要手动发送消息。除非您在工作线程中使用COM单元线程对象,或者向工作线程发布自定义线程消息,否则在工作线程中运行消息循环几乎没有什么用处,即使这样,ProcessMessages()也不适合用于此目的。
https://stackoverflow.com/questions/65797197
复制相似问题