众所周知,在UI线程和工作线程之间需要沟通的情况下,由于线程安全(句柄重建),必须创建一个隐藏窗口。安全和良好的设计AllocateHWND响应多个线程?
对于举例说明:
Form1
有N个dynamicaly创建TProgressBar
实例与运行的后台的相同的名称。- 始终保证
WM_REFRESH
只会在任务线程内部调用。 Form1
具有H : THandle property
其分配以下过程:过程RefreshStat(VAR消息:TMessage);消息WM_REFRESH;
里面
RefreshStat
,在情况下,当只有1个后台线程我可以很容易地使用L
和W
参数映射任务ID和位置。
我不知道标题说我想知道什么,而是让,如果我们有一个具有运行多个后台任务的应用程序的想象。
在我的情况下,我使用TProgressBar
来报告完成的进度。
请问AllocateHwnd
是否保证所有消息都没有竞争条件到达隐藏窗口?
如果两个或多个任务同时发布消息会发生什么?
如果这需要手动控制,我想知道除了在自定义消息中创建另一个消息循环系统还有其他事情要做。
我希望问题很清楚。
不要将THandle用于窗口。使用HWND。您可以使用THandle来传递给CloseHandle,即Windows类型的HANDLE。 –
@Matheus,你如何从那个隐藏窗口更新那些进度条?换句话说,你想如何与窗体同步隐藏的窗口?这不是太复杂吗?您可以直接将['progress bar messages'](http://msdn.microsoft.com/cs-cz/library/windows/desktop/ff485990(v = vs.85).aspx)发布到控制你的表格。 – TLama
@TLama问题是窗口重新创建。后台任务不能使用VCL窗口句柄,因为它可以并且经常会被破坏并重新创建。因此,表单需要一个隐藏的窗口,其生命周期是确定性的。 –