• 8838阅读
  • 7回复

[提问]求解,QTimer用溢出标志位把程序停在while(1)处就崩溃 [复制链接]

上一主题 下一主题
离线纵刀少年
 

只看楼主 倒序阅读 楼主  发表于: 2014-05-04
QTimer::singleShot(50, this, SLOT(delay_out()));  
while(delay_time_flag==0);    
delay_time_flag=0;

void MainWindow::delay_out()
{    
delay_time_flag=1;    
qDebug()<<"timeout:"<<delay_time_flag;
}




如果没有while(delay_time_flag==0)这句,则delay_out可以被正常调用,程序也没问题。但我现在想把程序停在一个位置等待一段时间,用这方法却发现不正常了。
离线realfan

只看该作者 1楼 发表于: 2014-05-04
你把singleShot的时间设长一点,不就可以了吗

某个地方停止,可以用QThread::msleep(int)
离线dbzhang800

只看该作者 2楼 发表于: 2014-05-04
看他的意思是,弄个死循环将程序停到哪儿,而后准备用一个QTimer去修改循环条件,使得循环退出。


要使得这个思路工作,要么用用多线程,要么死循环内不停处理事件 QCoreApplication::processEvents()。
离线pxiao_xiao

只看该作者 3楼 发表于: 2014-05-04
QTimer在同一个线程里执行  while已经卡死这个线程
离线纵刀少年

只看该作者 4楼 发表于: 2014-05-05
回 pxiao_xiao 的帖子
pxiao_xiao:QTimer在同一个线程里执行  while已经卡死这个线程 (2014-05-04 22:30) 

就是在执行while的时间里,槽函数中的部分不能优先被执行吗?
离线纵刀少年

只看该作者 5楼 发表于: 2014-05-05
回 dbzhang800 的帖子
dbzhang800:看他的意思是,弄个死循环将程序停到哪儿,而后准备用一个QTimer去修改循环条件,使得循环退出。
要使得这个思路工作,要么用用多线程,要么死循环内不停处理事件 QCoreApplication::processEvents()。 (2014-05-04 12:58) 

嗯,就是像单片机里定时器中断那样用。
槽对信号的响应不是会优先被处理的么,咋程序不会在while期间调到槽函数处执行?难道是线程的时间片一直处在while这里,而QTimer无法发出信号吗? 还是QTimer的时间计算其实还是依赖于同一线程的东西之类~~
离线dbzhang800

只看该作者 6楼 发表于: 2014-05-06
它不是单片机底层的中断,所以你不能够这样类比。

一个线程是不能同时做两件事情的。
离线dbzhang800

只看该作者 7楼 发表于: 2014-05-06
你需要了解一下Qt的事件系统,只有你的当前线程在运行时间循环(通过哪些exec() 或者直接调用processEvents() )时,它才能主动处理事件。

而且在Qt的事件系统中,QTimer事件也是属于优先级比较低的事件。
快速回复
限100 字节
 
上一个 下一个