我有一个关于线程在其生命周期开始时缺少消息队列的问题。MSDN解释
消息发布到的线程必须创建了消息队列,否则对PostThreadMessage的调用失败。使用下列方法之一处理此情况: (1)调用PostThreadMessage。如果失败,请调用睡眠函数并再次调用PostThreadMessage。重复,直到PostThreadMessage成功。 (2)创建事件对象,然后创建线程。使用WaitForSingleObject函数在调用PostThreadMessage之前等待将事件设置为已发出信号的状态。在将消息发送到的线程中,调用
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)强制系统创建消息队列。设置事件,以指示线程已准备好接收已发布的消息。
方法(1)解决了我的问题,对PostThreadMethod()的第二次调用在我的应用程序中总是成功的。
但是,我想理解第二个方法,根本不理解“事件对象”(当然不是正常的Delphi事件?)“以信号状态”和“设置事件为指示”。
问:请有人把第(2)段翻译成一个简短的Delphi代码示例好吗?
发布于 2018-04-02 11:44:34
这些事件对象是同步对象,在这里:事件对象中描述了这些对象。
该主题的底部是一个指向使用事件对象的链接,它给出了示例代码,演示如何创建事件、设置事件、等待事件等等。
简而言之,您使用以下功能:
CreateEvent来创建事件对象。CloseHandle来摧毁它。SetEvent和ResetEvent设置和重置事件对象。WaitForSingleObject等待它的信号。您可以使用来自TEvent单元的System.SyncObjs类包装所有这些低级API调用。然后这个过程就会变成这样:
TEvent对象,Event说。Event。Event.WaitFor,等待工作线程发出消息队列存在的信号。Execute方法开始时),让它创建消息队列,然后通过调用Event.SetEvent来设置事件。https://stackoverflow.com/questions/49610544
复制相似问题