众所周知,如果需要在UI线程和工作线程之间进行通信,则必须创建隐藏窗口,因为线程安全(句柄重建)。
例如:
Form1
有N个动态创建的TProgressBar
个实例,其背景名称与正在运行的背景相同。 WM_REFRESH
只会在任务线程中调用。 Form1
有H : THandle property
分配以下过程:
过程RefreshStat(var Message:TMessage);消息WM_REFRESH;
在RefreshStat
内,如果只有一个后台线程,我可以轻松使用L
和W
参数来映射任务ID和位置。
我不知道标题是否说明了我想知道的内容,但让我们想象一下,如果我们有一个运行多个后台任务的应用程序。
在我的情况下,我使用TProgressBar
来报告已完成的进度。
AllocateHwnd
是否保证所有邮件在没有竞争条件的情况下到达隐藏窗口?
如果两个或多个任务同时发布消息会怎样?
如果需要手动控制,我想知道除了在自定义消息中创建另一个消息循环系统之外还有别的事情要做。
我希望这个问题足够明确。
答案 0 :(得分:5)
与线程关联的消息队列是线程安全队列。来自多个其他线程的同步和异步消息都安全地传送,没有有害的日期比赛。调用Windows消息API函数(如SendMessage和PostMessage)时无需任何外部同步。
如果两个线程同时发布或向同一窗口发送消息,则无法保证首先处理哪条消息。这就是所谓的良性竞争条件。如果您希望在另一个消息之前处理一条消息,则必须强制执行排序。