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 に答える