vc++ 怎么让while死循环执行一定时间后退出?

神仙约架 2012-11-09 09:55:19
我想让一个while循环最长执行2s,如果在两秒内循环条件不满足(a<10时循环马上跳出)马上跳出循环,部分代码如下,好像进不去OnTimer,请问怎么解决,或者换个其他写法也行,只要实现目标
if(****){
SetTimer(3,2000,NULL);
time_flag=0;
while(a>10){
if (time_flag==1){
KillTimer(3);
time_flag=0;
pEdit->ReplaceSel("wrong");
break;
}
}
KillTimer(3);
}

SpeckleDlg::OnTimer(UINT nIDEvent)
switch (nIDEvent){
.
.
case 3:
time_flag=1;
break;
.
.
}
...全文
1053 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hankcs 2012-11-10
  • 打赏
  • 举报
回复
用不着那么复杂的多线程和内核对象
引用 6 楼 sqqwm 的回复:
引用 2 楼 tiger9991 的回复:因为while把该消息阻塞了。 并且a>10条件一直成立,就进入死循环了。 你要达到多次循环的目的,可以自己建立一个新的线程,把while放进去。然后用内核对象CEvent来控制。在OnTimer中控制内核对象CEvent。 是哦,是我开始思路就错了,我是想如果if成立就判断某个状态a是否成立,如果两秒内a状态成立就……

int nStart = GetTickCount;
while(a>10)
{
if(GetTickCount - nStart > 2 * 1000) break;
//......
}
神仙约架 2012-11-10
  • 打赏
  • 举报
回复
引用 4 楼 chayedanwc 的回复:
在While体内计时就可以,时间超过2S就Break;不过这样是不精确的,因为Break的计时要等待循环运行到计算时间的时候才有机会Break; 要不你用事件吧,While循环写在线程中,外部用内核计时,WaitForSingleObject2秒超时后TerminateThread杀掉线程,并释放线程中使用的资源(这个释放资源我没试过,强杀线程会有一些资源释放的问题……
是哦,是我开始思路就错了,我是想如果if成立就判断某个状态a是否成立,如果两秒内a状态成立就继续执行,如果等待两秒a还为成立就停止执行并报错 就这样我加了个while死循环,循环条件是a不成立,想着是当while不成立时就执行while后面的程序,如果两秒到了直接在while内停止并报错,我应该怎么写,麻烦给个思路框架,我现在思维好像被锁住了,挑不出来了,谢谢
神仙约架 2012-11-10
  • 打赏
  • 举报
回复
引用 3 楼 lang14 的回复:
可以用线程,在加event来控制,也可以只用定时器,不过可能会有点误差 whlie(dwTime<26*1000) { } settime(1,1000,NULL); SpeckleDlg::OnTimer(UINT nIDEvent) switch (nIDEvent){ { case 1: dwTime+=1000; } ……
是哦,是我开始思路就错了,我是想如果if成立就判断某个状态a是否成立,如果两秒内a状态成立就继续执行,如果等待两秒a还为成立就停止执行并报错 就这样我加了个while死循环,循环条件是a不成立,想着是当while不成立时就执行while后面的程序,如果两秒到了直接在while内停止并报错,我应该怎么写,麻烦给个思路框架,我现在思维好像被锁住了,挑不出来了,谢谢
神仙约架 2012-11-10
  • 打赏
  • 举报
回复
引用 2 楼 tiger9991 的回复:
因为while把该消息阻塞了。 并且a>10条件一直成立,就进入死循环了。 你要达到多次循环的目的,可以自己建立一个新的线程,把while放进去。然后用内核对象CEvent来控制。在OnTimer中控制内核对象CEvent。
是哦,是我开始思路就错了,我是想如果if成立就判断某个状态a是否成立,如果两秒内a状态成立就继续执行,如果等待两秒a还为成立就停止执行并报错 就这样我加了个while死循环,循环条件是a不成立,想着是当while不成立时就执行while后面的程序,如果两秒到了直接在while内停止并报错,我应该怎么写,麻烦给个思路框架,我现在思维好像被锁住了,挑不出来了,谢谢
lgstudyvc 2012-11-10
  • 打赏
  • 举报
回复
死循环的思路,就是不太靠谱的 越走越远了嚎
lang14 2012-11-10
  • 打赏
  • 举报
回复
我那里写的就是思路了,很清晰了
chayedanwc 2012-11-10
  • 打赏
  • 举报
回复
在While体内计时就可以,时间超过2S就Break;不过这样是不精确的,因为Break的计时要等待循环运行到计算时间的时候才有机会Break; 要不你用事件吧,While循环写在线程中,外部用内核计时,WaitForSingleObject2秒超时后TerminateThread杀掉线程,并释放线程中使用的资源(这个释放资源我没试过,强杀线程会有一些资源释放的问题,不知道用全局的资源能不能释放完全,你可以试一下。)。
神仙约架 2012-11-10
  • 打赏
  • 举报
回复
结贴,谢谢各位的帮助,最后我采用了网友hankcs 和hushoubo 的方法
hushoubo 2012-11-10
  • 打赏
  • 举报
回复
如果要求不精确的话, DWORD dwTick = GetTickCount(); while ( 1 ) { //do something if ( 2000 < GetTickCount() - dwTick ) { break; } }
欧阳春晖 2012-11-10
  • 打赏
  • 举报
回复
我有个建议:可不可以设定一个函数,用于计时,如果超过2s返回失败,在while里使用逻辑或运算符进行判断,如果不符合条件,while就会自动退出。
lang14 2012-11-09
  • 打赏
  • 举报
回复
可以用线程,在加event来控制,也可以只用定时器,不过可能会有点误差 whlie(dwTime<26*1000) { } settime(1,1000,NULL); SpeckleDlg::OnTimer(UINT nIDEvent) switch (nIDEvent){ { case 1: dwTime+=1000; }
傻X 2012-11-09
  • 打赏
  • 举报
回复
因为while把该消息阻塞了。 并且a>10条件一直成立,就进入死循环了。 你要达到多次循环的目的,可以自己建立一个新的线程,把while放进去。然后用内核对象CEvent来控制。在OnTimer中控制内核对象CEvent。
转角天边 2012-11-09
  • 打赏
  • 举报
回复
time_t t1,t2; t1=time(NULL); while(...) { t2=time(NULL); if(t2-t1>2) break; ..... } 这样子应该是可以的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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