首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostThreadMessage:创建消息队列

PostThreadMessage:创建消息队列
EN

Stack Overflow用户
提问于 2018-04-02 11:36:34
回答 1查看 939关注 0票数 2

我有一个关于线程在其生命周期开始时缺少消息队列的问题。MSDN解释

消息发布到的线程必须创建了消息队列,否则对PostThreadMessage的调用失败。使用下列方法之一处理此情况: (1)调用PostThreadMessage。如果失败,请调用睡眠函数并再次调用PostThreadMessage。重复,直到PostThreadMessage成功。 (2)创建事件对象,然后创建线程。使用WaitForSingleObject函数在调用PostThreadMessage之前等待将事件设置为已发出信号的状态。在将消息发送到的线程中,调用PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)强制系统创建消息队列。设置事件,以指示线程已准备好接收已发布的消息。

方法(1)解决了我的问题,对PostThreadMethod()的第二次调用在我的应用程序中总是成功的。

但是,我想理解第二个方法,根本不理解“事件对象”(当然不是正常的Delphi事件?)“以信号状态”和“设置事件为指示”。

问:请有人把第(2)段翻译成一个简短的Delphi代码示例好吗?

EN

回答 1

Stack Overflow用户

发布于 2018-04-02 11:44:34

这些事件对象是同步对象,在这里:事件对象中描述了这些对象。

该主题的底部是一个指向使用事件对象的链接,它给出了示例代码,演示如何创建事件、设置事件、等待事件等等。

简而言之,您使用以下功能:

  • CreateEvent来创建事件对象。
  • CloseHandle来摧毁它。
  • SetEventResetEvent设置和重置事件对象。
  • WaitForSingleObject等待它的信号。

您可以使用来自TEvent单元的System.SyncObjs类包装所有这些低级API调用。然后这个过程就会变成这样:

  • 在重置状态下创建一个TEvent对象,Event说。
  • 创建工作线程,传入Event
  • 在管理器线程中调用Event.WaitFor,等待工作线程发出消息队列存在的信号。
  • 当工作线程开始执行时(即在它的Execute方法开始时),让它创建消息队列,然后通过调用Event.SetEvent来设置事件。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49610544

复制
相关文章

相似问题

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