【发布时间】:2011-01-28 23:39:01
【问题描述】:
请参考以下链接,因为我试图简化我遇到的问题,但现在遇到了我无法解决的问题。
链接:Qt: How to use QTimer to print a message to a QTextBrowser every 10 seconds?
在上面链接的帖子中,我通过简单地说我想按一个按钮并让它每 10 秒在QTextBrowser 中显示一些内容来简化我正在尝试执行的任务。当时我无法让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 有一个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(抱歉太忙,无法完整回答)