请参考下面的链接,因为我试图简化我遇到的问题,现在遇到了一个我无法解决的问题。Qt:如何在QTimer处于活动状态时延迟程序?
链接:Qt: How to use QTimer to print a message to a QTextBrowser every 10 seconds?
在张贴的链接上面我简单我想简单地说,我想按下一个按钮,并把它显示在一个QTextBrowser
每10秒的东西做任务。当时我在QTimer
工作时遇到问题,所以我认为如果我可以让QTimer
工作,那么我可以完成我的任务。
什么我真的试图做的是从文件中读取行,每2500线后,我想打印一个信息,然后等待10秒。
伪代码:
while(not at the end of the file)
{
read in 2500 lines
print a message
wait 10 seconds
}
QTimer
是好的,但它的什么,我想要它做的正好相反。而不是发送消息并等待10秒,首先他们等待10秒,超时然后发送消息。
所以要按照我想要的方式工作,我首先调用了printMessage()
SLOT,然后我制作了一个名为stopTimer()
的SLOT,它可以简单地停止定时器。所以在经过10秒后,它将简单地调用stopTimer(),然后继续处理输入文件。
走上真正的问题:
Qt不等待QTimer
完成它通过代码移动之前。我希望代码在读取接下来的2500行代码之前等待整整10秒钟。我发现QTimer
有一个返回bool值的isActive()
函数。
所以在我想要的10秒延迟完成的地方,我把下列:
while(timer->isActive());
我想通程序会留在这个循环持续10秒,然后退出QTimer
超时后因那么情况就会是错误的。问题在于它不会退出循环,因为无论在此循环中等待多长时间,定时器的状态都不会改变!我使用调试器进行了检查,并且无论经过的时间如何,isActive()
都保持为真。
我然后省略while(timer->isActive())
循环并在调试器中观察到的定时器。看起来,定时器并没有真正开始计时,直到退出while(不在文件末尾)。所以我相信由于while(timer->isActive())
循环嵌套在这里,所以它永远不会超时。我可能是错的,但这似乎正在发生。此外,令人讨厌的是QTimer
对象没有字段显示定时器处于活动状态时的已用时间。因此,我无法检查经过的时间以进一步调试。
有人请测试一下,或让我知道这个解决方法!
的东西,听起来很容易,这一直是最大的痛苦,我曾在最近的时间,但我一般不使用Qt所以它可能是我缺乏经验。
下面是从代码的摘录我目前冻结如上所述:
void Form::startBtn_pushed()
{
QTimer *timer = new QTimer(this);
QFile file(“file.txt”);
QTextStream stream(&file);
QString line;
int lineCount = 0;
connect(timer, SIGNAL(timeout()), this, SLOT(stopTimer()));
while(!(stream.atEnd())
{
line = stream.readLine();
lineCount++;
if(lineCount == 2500)
{
printMessage();
timer->start(10000);
while(timer->isActive()); //Wait for timer to timeout before continuing
}
}
}
很抱歉的长期职位,如果我可能已经和我在这里的代码中的任何语法错误。我的开发机器上没有互联网接入,所以我不得不在这里重新输入。
结帐qtimer :: singleshot(对不起,太忙了完整的答案) – 2011-01-28 23:41:48