1

众所周知,当需要在 UI 线程和工作线程之间进行通信时,由于线程安全(句柄重构),必须创建一个隐藏窗口。

例如:

  • Form1有 N 个动态创建TProgressBar的实例,与后台运行的名称相同。
  • 始终保证WM_REFRESH只会在任务线程内调用。
  • Form1H : THandle property分配以下程序:

    过程 RefreshStat(var Message: TMessage); 消息 WM_REFRESH;

  • 在内部RefreshStat,如果只有 1 个后台线程,我可以轻松地使用参数来映射任务 ID 和位置LW

我不知道标题是否说明了我想知道的内容,但让我们想象一下,如果我们有一个运行多个后台任务的应用程序。
就我而言,我TProgressBar用来报告完成的进度。

是否AllocateHwnd保证所有消息在没有竞争条件的情况下到达隐藏窗口?
如果两个或多个任务同时发布消息会发生什么?

如果这需要手动控制,我想知道除了在自定义消息中创建另一个消息循环系统之外是否还有其他事情要做。

我希望这个问题足够清楚。

4

1 回答 1

5

与线程关联的消息队列是线程安全队列。来自多个其他线程的同步和异步消息都可以安全地传递,没有有害的日期竞争。调用 SendMessage 和 PostMessage 等 Windows 消息 API 函数时,无需任何外部同步。

如果两个线程同时向同一个窗口发布或发送消息,则无法保证首先处理哪个消息。这就是所谓的良性竞争条件。如果您希望在另一条消息之前处理一条消息,那么您必须强制执行排序。

于 2013-07-22T21:12:35.630 回答