我需要知道使用允许我使用整个应用程序的ProcessMessages是否合法。
伪代码:
主线程按钮调用 - 搜索。
procedure ButtonOnClick;
begin
var1 = ExecuteSearch();
end;
function ExecuteSearch:Something;
begin
thread.StartThread;
while thread.Finished do
Application.ProcessMessages;
result := something;
end;
当我使用这种结构时,我可以点击我的软件的其他部分并使用它。但我不知道这是如何运作的。如果它安全。
答案 0 :(得分:3)
虽然这可以安全,但你正在玩火。你冒着重新入侵的风险。您必须确保用户无法再次按下该按钮。我相信你在搜索运行时禁用了它。在第一次呼叫ProcessMessages
之前,您必须确保它已被禁用。
我的建议始终是避免使用ProcessMessages
。最好是启动线程并安排它在完成后通知主线程。当然,您仍然需要在线程运行时禁用该按钮。
但是,如果你真的必须使用ProcessMessages
,请不要像这样忙碌循环。使用整个处理器等待长时间运行的搜索操作完成并没有什么意义。使用更智能的阻塞循环:
while MsgWaitForMultipleObjects(1, Thread.Handle, False,
INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do
Application.ProcessMessages;
MsgWaitForMultipleObjects
函数将阻塞,直到:
循环在线程发出信号时终止,但也处理任何排队的消息。
答案 1 :(得分:2)
虽然代码是安全的,但你还可以做的是在你正在启动的线程上使用OnTerminate事件。这样你就让Delphi控制如何从后台线程回发到主线程。在内部,它使用线程的Synchronize方法,您可以自己使用该方法让线程将中间进度信息发布到主线程。