我一直在主线程中显示这些东西,并使用事件将窗口的末尾与线程同步,以便在窗口关闭时让它知道.
今天,在开发过程中,我想将显示的表单从线程移动到主UI,但它已成功显示.我添加的唯一内容是在主线程中我正在推送等待事件的消息:
procedure WaitWithMessageLoop();
var
vWaitForEventHandles:array[0..1] of THandle;
vWaitForResponse:DWORD;
Msg: TMSG;
begin
vWaitForEventHandles[0] := LServiceMonitor.Handle;
while (1=1) do
begin
vWaitForResponse := MsgWaitForMultipleObjects(1, vWaitForEventHandles, FALSE, INFINITE, QS_ALLINPUT);
if (vWaitForResponse = WAIT_OBJECT_0 + 1) then
begin
while (PeekMessage(msg,0,0,0,PM_REMOVE)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
end
else
if (vWaitForResponse = WAIT_FAILED)
then RaiseLastOSError
else break;
end;
end;
Run Code Online (Sandbox Code Playgroud)
所以我的问题是.这样的场景是否可以接受?或者我应该移动一个表单以显示在主线程中吗?
谢谢
您无法在主GUI线程之外可靠地运行VCL表单.当您尝试执行此操作时,它似乎可以正常工作,但在将来的某个时候,此类代码将失败.最有可能在您最重要的客户机器上,以一种特别关键的方式!
VCL的设计使得所有VCL表单仅从主GUI线程创建和操作.如果需要调用VCL表单,则必须使用类似工具TThread.Synchronize来确保在GUI线程上创建表单.
| 归档时间: |
|
| 查看次数: |
627 次 |
| 最近记录: |