多个定时器访问修改同一变量会导致冲突么?
我的程序中用了4个定时器,
每个定时器的代码如下:
void __fastcall TFDownload::Timer1Timer(TObject *Sender)
{
if(bWriting)
return;
else
{
Timer1->Enabled =false;
bWriting=true;
}
//do something
....................
//done
bWriting=false;
}
每个定时器每隔50ms触发一次。bWriting 是4个定时器都访问的公共变量,程序运行几百次偶尔会出现一次不正常的现象。请问这样做有问题吗?如有要怎么改呢?
[解决办法]
多线程有冲突,但定时器中是不会有冲突的。但
执行逻辑上有没有问题靠你自已了。
[解决办法]
由于Timer->Enabled=false;会引发计时器开关函数,会存在短暂的程序调用与数据挂起操作,有可能会存在跨时间片的问题,因此造成不必要的函数竞争问题。
一个简单的解决方法是:
void __fastcall Form1::Timer1Timer(TObject *Sender){ if(bWriting) return; bWriting = true; Timer1->Enabled = false; ... bWriting = false;}
[解决办法]
我感觉4个定时器总有些复杂,如果你的定是时器都是同样的定时时间(50ms),还不如使用1个定时器(每个50/4ms,本身定时器不是很精确),然后
void __fastcall Form1::Timer1Timer(TObject *Sender)
{
static int stat=0;
switch(stat)
{
case 0:
time1proc();//原来定时器1的程序
break;
case 1:
time2proc();//原来定时器2的程序
break;
case 2:
time3proc();//原来定时器3的程序
break;
case 3:
time4proc();//原来定时器4的程序
}
stat++;
stat%=4;
}
}
[解决办法]
定时器都在同一个线程,应该不会有变量冲突的问题
[解决办法]
一个界面上的多个定时器不会冲突,因为在同一个线程内,。
[解决办法]
我觉得LZ遇到的问题用一个定时器未必能方便的解决
看他贴的那些代码的情况 应该是这4个定时器的Enable都是根据外部条件来决定的
if(bWriting)
return;
else
{
Timer1->Enabled =false;
bWriting=true;
}
如果是这样我觉得还是就保持4个算了,这样至少程序上清楚很多,也不会有什么影响
如果这4个定时器都是很规律的间隔多少ms去执行 那到可以就用一个来控制