主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.01.08;
下载:[xml.tar.bz2];

向下

线程:挂起/恢复和同步 找到类似的分支


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

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

使用
Windows,消息,SysUtils,类,图形,控件,表单,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

类型

TMyThread = class(TThread)
私立
程序更新;
保护
程序执行; 覆盖;
结束;

TMainForm = class(TForm)
Timer1:TTimer;
程序FormCreate(发件人:TObject);
procedure FormClose(Sender:TObject; var Action:TCloseAction);
程序Timer1Timer(发件人:TObject);
私立
{私人声明}
MyThread: TMyThread;
公开
{公开声明}
结束;

VAR
MainForm:TMainForm;

履行

{$ R * .dfm}

procedure TMyThread.Update;
开始
//
结束;

程序TMyThread.Execute;
开始
重复
睡眠(100);
同步(更新);
直到终止
结束;

程序TMainForm.FormCreate(Sender: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;
结束;

procedure TMainForm.Timer1Timer(Sender: 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 整个分支

论坛:“主要”;
当前存档:2002.01.08;
下载:[xml.tar.bz2];

楼上















内存:0.82 MB
时间:0.092 c
14-22337
亚历山大
2001-11-05 13:20
2002.01.08
打印服务器DP-101(D-Link)并从DOS下打印


3-21981
Termik
2001-12-06 08:22
2002.01.08
关于关键字段和IDENTITY


3-21988
安德鲁
2001-11-29 22:16
2002.01.08
SQL


6-22281
维罗纳
2001-10-04 12:22
2002.01.08
Отправка сообщений на e-mail


14-22353
梅林
2001-11-02 10:13
2002.01.08
我很震惊





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日语 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский