誰でもこのコードが私のアプリケーションの応答を停止させる理由を教えてもらえますか?ロックにつながるタイマー
私のアプリケーションはCOMライブラリを呼び出します。私はCOMライブラリのイベントが発射されるのを待っています。 私はCOMライブラリは解雇かどうかをチェック維持するためにタイマーを使用します。
procedure MyTimer(hWnd: HWND; uMsg: Integer; idEvent: Integer; dwTime: Integer); stdcall;
begin
//writeln('Timer Event');
end;
イベントがこのように解雇場合、私はチェックしておく:
procedure MyClass.Loop(bwait: boolean);
var
s: TDateTime;
id: uint;
begin
try
id := SetTimer(0, 1, 1000, @MyTimer);
s := Now;
while bwait do
begin
sleep(30);
Application.ProcessMessages;
if bwait = false then // Event fired, all good=> exit
begin
KillTimer(0, id);
break;
end;
if Now - s > EncodeTime(0, 0, 1000, 0) then // Timed out=> exit
begin
KillTimer(0, id);
break;
end;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end;
COMライブラリのイベントは、それがBWAITブール変数を設定し、発射それはすべての良いことを意味し、私たちは出て行くことができます。
イベントが一定の時間内に発生しなかった場合は、私は&を終了してユーザーに通知します。
このコードでは、スレッドロックが作成されることがあります。
私のアプリケーションとCOMライブラリが応答を停止します。 ロックの原因は何ですか?
上記コードはどのように改善できますか?
ありがとうございます。
COMライブラリ、スレッドモデルなどの知識がなければ、それは言うことができません。確かに、問題のコードは、実際には、 'Sleep'と' Application.ProcessMessages'の呼び出しから非常に疑わしいと思われます。 –
アプリケーションでスレッドを使用していません。 COMライブラリはスレッドを内部的に使用していますが、わかりません。 COMライブラリイベントによってbwait変数が設定されているかどうかを確認するためにApplication.ProcessMessagesは必要ありませんか? 私はスリープ&Application.ProcessMessagesなしのコードを試します。 ありがとう –
非同期モデルを使用して同期コードを書き込もうとしないでください。イベントを使用することの全体的なポイントは、***あなたが他に何をしても***続けることになっているということです。発生したイベントを処理します。取り消しをしようとすると、すべてのメリットが失われ、特定のイベントを受け取るまでコードをブロックする必要があります。受け取らないとどうなりますか? _ロックはロックアップ!_ –