多个定时器访问修改同一变量会导致冲突么?

TripH0101 2010-03-22 04:59:39
我的程序中用了4个定时器,
每个定时器的代码如下:
void __fastcall TFDownload::Timer1Timer(TObject *Sender)
{
    if(bWriting)
       return;
else
{
Timer1->Enabled =false;
bWriting=true;
}
         //do something
....................
//done
bWriting=false;
}
每个定时器每隔50ms触发一次。bWriting 是4个定时器都访问的公共变量,程序运行几百次偶尔会出现一次不正常的现象。请问这样做有问题吗?如有要怎么改呢?
...全文
396 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
周药师 2010-03-24
  • 打赏
  • 举报
回复
4个定时器是合理的
如果用一个定时器会出现等待的
lz的问题应该不是定时器的问题,
Jim@luckeeinc.com 2010-03-24
  • 打赏
  • 举报
回复
我觉得LZ遇到的问题用一个定时器未必能方便的解决
看他贴的那些代码的情况 应该是这4个定时器的Enable都是根据外部条件来决定的
if(bWriting)
return;
else
{
Timer1->Enabled =false;
bWriting=true;
}
如果是这样我觉得还是就保持4个算了,这样至少程序上清楚很多,也不会有什么影响

如果这4个定时器都是很规律的间隔多少ms去执行 那到可以就用一个来控制
TripH0101 2010-03-24
  • 打赏
  • 举报
回复
还有其它办法吗?
draculamx 2010-03-23
  • 打赏
  • 举报
回复
定时器都在同一个线程,应该不会有变量冲突的问题
柯本 2010-03-23
  • 打赏
  • 举报
回复
我感觉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;
}
}


nuozhai 2010-03-23
  • 打赏
  • 举报
回复
一个界面上的多个定时器不会冲突,因为在同一个线程内,。
庄鱼 2010-03-22
  • 打赏
  • 举报
回复
由于Timer->Enabled=false;会引发计时器开关函数,会存在短暂的程序调用与数据挂起操作,有可能会存在跨时间片的问题,因此造成不必要的函数竞争问题。
一个简单的解决方法是:

void __fastcall Form1::Timer1Timer(TObject *Sender)
{
if(bWriting)
return;
bWriting = true;
Timer1->Enabled = false;
...
bWriting = false;
}
BCBPLC 2010-03-22
  • 打赏
  • 举报
回复
多线程有冲突,但定时器中是不会有冲突的。但
执行逻辑上有没有问题靠你自已了。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧