ProcessMessages和应用程序的使用

时间:2012-04-26 13:33:47

标签: delphi

我需要知道使用允许我使用整个应用程序的ProcessMessages是否合法。

伪代码:

主线程按钮调用 - 搜索。

procedure ButtonOnClick;
begin
    var1 = ExecuteSearch();
end;    

function ExecuteSearch:Something;
begin
 thread.StartThread;
 while thread.Finished do
 Application.ProcessMessages;
 result := something;
end;

当我使用这种结构时,我可以点击我的软件的其他部分并使用它。但我不知道这是如何运作的。如果它安全。

2 个答案:

答案 0 :(得分:3)

虽然这可以安全,但你正在玩火。你冒着重新入侵的风险。您必须确保用户无法再次按下该按钮。我相信你在搜索运行时禁用了它。在第一次呼叫ProcessMessages之前,您必须确保它已被禁用。

我的建议始终是避免使用ProcessMessages。最好是启动线程并安排它在完成后通知主线程。当然,您仍然需要在线程运行时禁用该按钮。

但是,如果你真的必须使用ProcessMessages,请不要像这样忙碌循环。使用整个处理器等待长时间运行的搜索操作完成并没有什么意义。使用更智能的阻塞循环:

while MsgWaitForMultipleObjects(1, Thread.Handle, False, 
    INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do
  Application.ProcessMessages;

MsgWaitForMultipleObjects函数将阻塞,直到:

  1. 消息放在队列中,或
  2. 线程已发出信号。线程完成后会发出信号。
  3. 循环在线程发出信号时终止,但也处理任何排队的消息。

答案 1 :(得分:2)

虽然代码是安全的,但你还可以做的是在你正在启动的线程上使用OnTerminate事件。这样你就让Delphi控制如何从后台线程回发到主线程。在内部,它使用线程的Synchronize方法,您可以自己使用该方法让线程将中间进度信息发布到主线程。