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

向下

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


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

亲爱的同事们,请帮助,我已经没有睡过3之夜了。
问题是:
如果经常挂起(挂起)并启动(恢复)调用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}

程序TMyThread.Update;
开始
//
结束;

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

程序TMainForm.FormCreate(Sender:TObject);
开始
MyThread:= TMyThread.Create(false);
Timer1.Interval:= 1;
Timer1.Enabled:= true;
结束;

程序TMainForm.FormClose(Sender:TObject; var Action:TCloseAction);
开始
Timer1.Enabled:= false;
如果MyThread.Suspended那么MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
结束;

程序TMainForm.Timer1Timer(发件人:TObject);
开始
如果不是MyThread。暂停MyThread。暂停我的线程。恢复;
结束;

所有这一切都是需要的:我制作了一个动画按钮:用鼠标指向它 - 流开始播放,播放动画,移除鼠标 - 流程停止。 用户可以经常携带鼠标,因此导致上述问题。
我的程序不能使用Timer而不是stream。
如果有人告诉你这是怎么回事,我会给他最好的组件(包括一个动画按钮)。 我庄严地发誓。
我为长期问题道歉,但简而言之,它不可能。
Delphi6,Win98。
谢谢。



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

在这种情况下,使用暂停/恢复不是最佳解决方案。 并且每个按钮的流量使用也很糟糕。 但是一旦你需要一个流,那么为什么不让它变得更容易:当需要开始播放动画时,我们设置标志,execute方法检查这个标志,如果设置了它,它就会绘制动画。 当光标消失时,我们重置此标志。
唯一没有问题的是,应该通过调用其中一个Interlocked *函数来改变标志。 例如,InterlockedIncrement / InterlockedDecrement。

“我为这个长期问题道歉,但绝不可能。”
所有问题都会如此冗长而详细:)



Страницы: 1 整个分支

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

楼上





内存:0.55 MB
时间:0.023 c
6-22312年
“利维坦”
2001-10-15 00:24
2002.01.08
嘿,谁知道Indy? 需要帮助!


1-22203年
T2
2001-12-16 07:07
2002.01.08
捕获缺席错误msWord


3-21948年
andre_polt
2001-12-04 16:22
2002.01.08
DB


4-22490年
SergeyDonetsk
2001-11-06 09:22
2002.01.08
与API一样,您可以了解Handle Canvas并进行设置


1-22079年
kserg@ukr.net
2001-12-19 13:11
2002.01.08
如何正确地将ToolBara按钮与MainMenu中的菜单项相关联?





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