1

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

伪代码:

主线程按钮调用 - 搜索。

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

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

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

4

2 回答 2

4

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

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

但是,如果您真的必须使用ProcessMessages,请不要使用这样的繁忙循环。使用整个处理器等待长时间运行的搜索操作完成没有多大意义。使用更智能的阻塞循环,如下所示:

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

MsgWaitForMultipleObjects函数将阻塞,直到:

  1. 一条消息被放置在队列中,或者
  2. 线程发出信号。线程完成时会发出信号。

当线程发出信号时循环终止,但也处理任何排队的消息。

于 2012-04-26T21:28:02.503 回答
2

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

于 2012-04-26T13:46:37.000 回答