フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];
ダウン
スレッド:サスペンド/レジューム&同期 似ている枝を探す
← →
mitry (2001-12-15 02:53) [0]親愛なる同僚、助けてください、私はすでに3夜寝ていませんでした。
問題は、
Synchronizeが呼び出すスレッドを頻繁に一時停止(中断)して開始(再開)した場合、ウィンドウを再描画すると、プログラムがハングすることがよくあります。
たとえば、次のプログラムを実行し、それとDelphiを切り替えると、以下のアプリケーションは永久にサイレントになります。
使用されます
Windows、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、ExtCtrls、StdCtrls、ComCtrls;
type
TMyThread = class(TThread)
プライベート
手順の更新。
保護された
実行する 上書きします。
終わり
TMainForm = class(TForm)
Timer1:TTimer。
手続きFormCreate(送信者:TObject);
手続きFormClose(送信者:TObject; varアクション:TCloseAction);
プロシージャーTimer1Timer(送信者:TObject);
プライベート
{私用宣言}
MyThread:TMyThread;
公共
{公開宣言}
終わり
VAR
メインフォーム:TMainForm。
実装
{$ R * .dfm}
プロシージャTMyThread.Update;
始まる
//
終わり
手順TMyThread.Execute;
始まる
繰り返す
スリープ(100);
同期(更新);
終了するまで
終わり
TMainForm.FormCreateプロシージャ(送信者:TObject);
始まる
MyThread:= TMyThread.Create(false);
Timer1.Interval:= 1;
Timer1.Enabled:= true;
終わり
procedure TMainForm.FormClose(Sender:TObject; var Action:TCloseAction);
始まる
Timer1.Enabled:= false;
MyThread.Suspendedの場合、MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
終わり
TMainForm.Timer1Timerプロシージャ(送信者:TObject);
始まる
MyThread.Suspendedではない場合はMyThread.Suspend、そうでない場合はMyThread.Resume。
終わり
これで必要なのはこれだけです。アニメーションボタンを作成しました。マウスでマウスをポイントすると、アニメーションを再生するストリームが開始し、マウスを削除すると、ストリームが停止します。 ユーザーはマウスを非常に頻繁に使用できるため、上記の問題が発生します。
私のプログラムでは、スレッドの代わりにタイマーを使用できません。
誰かが問題を教えてくれたら、私は彼に私の最高のコンポーネント(アニメーションボタンを含む)を提供します。 私は厳soleに誓います。
長い質問に謝りますが、決して短くはありません。
Delphi6、Win98。
ありがとう。
← →
paul_shmakov (2001-12-16 02:06) [1]この場合、サスペンド/レジュームを使用することは最適なソリューションではありません。 はい、各ボタンにストリームを使用することも悪いです。 しかし、ストリームが必要なので、それを簡単にしないようにしましょう:アニメーションの再生を開始する必要が生じたとき、フラグを設定し、executeメソッドがこのフラグをチェックし、設定されている場合、アニメーションを描画します。 カーソルがボタンから離れたとき-このフラグをリセットします。
唯一の問題は、問題がないことです。フラグは、Interlocked *関数のいずれかを呼び出して変更する必要があります。 例:InterlockedIncrement / InterlockedDecrement。
「長い質問をおizeびしますが、決して短くなりません。」
すべての質問は非常に長く詳細になります:)
ページ: 1 全枝
フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];
メモリ:0.56 MB
時間:0.023 c