首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Application.ProcessMessages in a TThread?

Application.ProcessMessages in a TThread?
EN

Stack Overflow用户
提问于 2021-01-19 18:17:08
回答 2查看 907关注 0票数 2

在线程(不是Main)中调用Application.Processmessages是"OK“,还是我应该期待遇到麻烦?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-19 20:07:50

从另一个线程调用Application.ProcessMessages确实是个坏主意,因为它实际上是针对VCL的,而且VCL并不是线程安全的。

尽管如此,我有很多线程都有一个message loop,因此它可以处理协作多任务和线程间的通信。

我总是通过调用Windows来编写自己的消息循环:

代码语言:javascript
复制
while GetMessage(MsgRec, 0, 0, 0) do begin
    TranslateMessage(MsgRec);
    DispatchMessage(MsgRec)
end;

当异步TWSocket必须在线程中运行时,我在ICS ()中大量使用了这一点。上面的代码是TIcsWndControl中ICS的一部分。TWSocket可以轻松地处理每个线程的数百个连接,但是如果您想处理数千个连接,则必须使用线程。

在工作线程或主线程和辅助线程之间使用Windows通常是避免调用TThread.Synchronize的解决方案:当您从线程中调用PostMessage时,发送线程将继续运行,而接收线程(创建在PostMessage中传递的窗口句柄)将在他自己的上下文中优雅地处理消息。

票数 5
EN

Stack Overflow用户

发布于 2021-01-19 19:18:38

TApplication.ProcessMessages()主要用于处理VCL消息。您不应该在工作线程中接收任何VCL消息,除非您正在从工作线程创建和显示TForm窗口。您不应该这样做,因为VCL不是线程安全的,不应该在主UI线程之外使用。

但是,尽管如此,如果在工作线程中没有接收到VCL消息,那么在工作线程中调用ProcessMessages()本身并不有害。它将向调用线程中的适当窗口过程发送任何接收到的消息(VCL或其他消息)。但是,如果您认为您需要在工作线程中手动发送消息,那么首先您需要问一下为什么需要手动发送消息。除非您在工作线程中使用COM单元线程对象,或者向工作线程发布自定义线程消息,否则在工作线程中运行消息循环几乎没有什么用处,即使这样,ProcessMessages()也不适合用于此目的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65797197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档