ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

ダウン

スレッド:サスペンド/レジューム&同期 似ている枝を探す


mitry   (2001-12-15 02:53) [0]

Уважаемые коллеги, помогите пожалуйста, я не спал уже 3 ночи.
問題は、
Если часто приостанавливать(Suspend) и запускать(Resume) поток, который вызыает Synchronize, то при перерисовке окна, программа часто виснет.
Например, если запустить следующую программу и попереключаться между ней и Delphi, то нижеприведенное приложение умолкнет навеки:

使用されます
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type

TMyThread = class(TThread)
プライベート
procedure Update;
保護された
実行する 上書きします。
終わり

TMainForm = class(TForm)
Timer1:TTimer。
手続きFormCreate(送信者:TObject);
手続きFormClose(送信者:TObject; varアクション:TCloseAction);
プロシージャーTimer1Timer(送信者:TObject);
プライベート
{私用宣言}
MyThread: TMyThread;
公共
{公開宣言}
終わり

VAR
メインフォーム:TMainForm。

実装

{$ R * .dfm}

procedure TMyThread.Update;
始まる
//
終わり

手順TMyThread.Execute;
始まる
繰り返す
スリープ(100);
Synchronize(Update);
終了するまで
終わり

TMainForm.FormCreateプロシージャ(送信者:TObject);
始まる
MyThread := TMyThread.Create(false);
Timer1.Interval := 1;
Timer1.Enabled := true;
終わり

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
始まる
Timer1.Enabled := false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
終わり

TMainForm.Timer1Timerプロシージャ(送信者:TObject);
始まる
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
終わり

Нужно это все вот для чего: я сделал анимированную кнопку: наводишь на нее мышкой - запускается поток, проигрывающий анимацию, убираешь мышку - поток останавливается. Пользователь может возить мышкой довольно часто, поэтому это и приводит к вышеописанной проблеме.
В моей программе нельзя использовать Timer вместо потоков.
Если кто-нибудь подскажет в чем тут дело, я подарю ему свои лучшие компоненты(включая анимированную кнопку). Торжественно клянусь.
Прошу прощения за длинный вопрос, но короче никак нельзя.
Delphi6, Win98.
ありがとう。



paul_shmakov   (2001-12-16 02:06) [1]

использование suspend/resume в данном случае не лучший выход. да и использование потока для каждой кнопки - тоже плохо. но раз нужен поток, тогда почему бы не сделать проще: когда возникает необходимость начать воспроизводить анимацию мы устанавливаем флаг , метод execute проверяет этот флаг, и, если он установлен, выполняет прорисовку анимации. когда курсор с кнопки ушел - сбрасываем этот флаг.
единственное, чтобы не было проблем, флаг нужно менять вызовом одной из Interlocked* функций. например, InterlockedIncrement/InterlockedDecrement.

"Прошу прощения за длинный вопрос, но короче никак нельзя."
все бы вопросы были такими длинными и подробными :)



ページ: 1 全枝

フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

2階









メモリ:0.82 MB
時間:0.04 c
14-22342
密な
2001-11-05 18:52
2002.01.08
競争! ゲームの壁紙(サイト)Sea Fight!


1-22199
T2
2001-12-16 07:16
2002.01.08
プロセスを作る


4-22484
トロイの木馬
2001-11-03 19:56
2002.01.08
どうやってDelphiにカーソルをロードすることができますか?


6-22313
SB
2001-10-01 15:05
2002.01.08
ネットワークのドロップアウトを手伝ってください。 してください


1-22186
ShnurO.K。
2001-12-15 23:05
2002.01.08
Alt + Ctrl + Delを押したときにプログラムを非表示にする方法





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