主页
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.56 MB
时间:0.023 c
1-22179
IKAR
2001-12-21 09:10
2002.01.08
如何在TTreeView中迭代根节点?


14-22408
fliz
2001-11-08 15:24
2002.01.08
这是Delphi中的一个错误吗? :((


1-22020
狮子座^太阳
2001-12-18 07:08
2002.01.08
TMemo


3-21940
塞里克
2001-12-05 09:15
2002.01.08
InterBase和VisualC ++


4-22500
YUS
2001-11-06 20:32
2002.01.08
桌面图标的坐标





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