ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "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];

2階









メモリ:0.56 MB
時間:0.023 c
4-22502
アレクサンダー
2001-11-06 11:00
2002.01.08
システムに登録されている内線番号のアイコンを取得する方法


1-22118
vlv
2001-12-19 21:59
2002.01.08
コンポーネント


14-22377
Sudiv
2001-11-08 10:54
2002.01.08
C ++?


14-22358
密な
2001-11-07 19:08
2002.01.08
小規模ながら高速なホスティングはどこで利用できますか?


1-22184
アリゲーター
2001-12-21 09:44
2002.01.08
多分誰か知ってる?





アフリカーンス語 アルバニア語 Arabic アルメニア語 アゼルバイジャン語 バスク ベラルーシ Bulgarian カタロニア語 中国語(簡体字) 中国語(繁体字) クロアチア チェコ語 デンマーク語 Dutch 英語 エストニア語 タガログ語 Finnish フランス語
ガリシア語 ジョージアン ドイツ語 ギリシャ語 ハイチ語 ヘブライ語 ヒンディー語 ハンガリー語 アイスランド語 Indonesian アイリッシュ イタリア語 和風 Korean ラトビア語 リトアニア マケドニア語 Malay マルタ語 Norwegian
ペルシア語 ポリッシュ ポルトガル語 ルーマニア ロシア語 セルビア Slovak スロベニア語 スペイン語 スワヒリ語 Swedish Thai トルコ語 ウクライナ語 ウルドゥー語 ベトナム語 ウェールズ語 イディッシュ語 ベンガル語 ボスニア語
セブアノ語 エスペラント グジャラート語 ハウサ語 モン族 イボ ジャワ語 カンナダ語 クメール語 ラオ語 ラテン マオリ語 マラーティー語 モンゴル語 ネパール語 パンジャブ語 ソマリ タミル語 テルグ語 ヨルバ語
ズールー語
Английский Французский Немецкий Итальянский ポルトガル語 Русский Испанский