HJa*_*Jay 2 delphi multithreading delphi-10.2-tokyo
我有一个问题,关于Thread在其生命周期开始时缺少消息队列.MSDN解释道
发布消息的线程必须已创建消息队列,否则对PostThreadMessage的调用将失败.使用以下方法之一来处理这种情况:
(1)调用PostThreadMessage.如果失败,请调用Sleep函数并再次调用PostThreadMessage.重复,直到PostThreadMessage成功.
(2)创建一个事件对象,然后创建该线程.在调用PostThreadMessage之前,使用WaitForSingleObject函数等待事件设置为信号状态.在要将消息发布到的线程中,调用
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)以强制系统创建消息队列.设置事件,以指示线程已准备好接收已发布的消息.
方法(1)解决了我的问题,第二次调用PostThreadMethod()总是在我的应用程序中成功.
但是,我想理解第二种方法并且根本不理解"事件对象"(当然不是正常的Delphi事件?)"以信号状态"和"设置事件指示".
问题:有人可以将段落(2)翻译成一个简短的Delphi代码示例吗?
这些事件对象是同步对象,在MSDN中描述:事件对象.
在该主题的底部是一个指向使用事件对象的链接,该链接提供了示例代码,显示如何创建事件,设置事件,等待事件等.
简而言之,您使用以下功能:
CreateEvent 创建事件对象.CloseHandle 摧毁它.SetEvent并ResetEvent设置和重置事件对象.WaitForSingleObject 等待它发出信号.您可以使用单元中的TEvent类System.SyncObjs来包装所有这些低级API调用.那么这个过程会变得如此:
TEvent对象Event.Event.Event.WaitFor在管理器线程中调用以等待工作线程发出其消息队列存在的信号.Execute方法开始时),让它创建其消息队列,然后通过调用设置事件Event.SetEvent.| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |