私はマルチスレッドの状況にあり、一度に1つのスレッドからしか実行したくない機能があります。しかし、伝統的な方法で関数をシリアライズするのではなく、最初のスレッドがそれを実行している間に関数を入力しようとするスレッドがすぐに戻るようにしたい。私は2番目のスレッドが最初のスレッドを待つことを望んでいません。私はスレッドを持つ試験サンプルを行うことができなかった原因ミューテックスとスレッドに関する問題
function InitMutex(const Name:String; var Handle: THandle):Boolean;
begin
Handle := CreateMutexA(NIL, True, PAnsiChar(Name));
Result := not (GetLastError = ERROR_ALREADY_EXISTS);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
mHandle: THandle;
begin
if not InitMutex(BalloonTipMutex, mHandle) then Exit;
MessageBox(0, 'Executing Code....', '', 0);
ReleaseMutex(mHandle);
CloseHandle(mHandle);
end;
これは、同じ問題を持つ単なる例です。
は、ここに私のコードです。
問題は次のとおりです。最初にbutton1をクリックします。メッセージボックスが表示されている間にメッセージボックスが表示されている間(関数がまだ動作していると仮定します)再度button1を押しても何も表示されませんメッセージボックスを閉じてもう一度ボタンを押すと、何も表示されません。 (そのが実行されていないため、再実行することになっ機能:S)
ありがとう、それは仕事を完全にしました:D、私はこの状況で使うべきだと思いますか? – killercode
このため、ミューテックスは非常に重いです。これが最良のソリューションだとは考えにくいです。 –
@Killercode、これについて別の質問をすることをお勧めします。 –