【问题标题】:How to check a variable periodically by QTimer如何通过 QTimer 定期检查变量
【发布时间】:2020-09-18 14:20:18
【问题描述】:

我在我的 qt 项目的 cpp 文件中设置了一个全局变量。我想每 100 毫秒检查一次这个变量,持续 5 秒,如果 5 秒后变量为 0,我想创建一个消息框。这是我的代码示例:

db.cpp:

if(case){
  g_clickedObj.readFlag = 1 ;
}
else{
g_clickedObj.readFlag = 0 ;
    }

主窗口.cpp

this->tmr = new QTimer();

connect(this->tmr,SIGNAL(timeout()),this,SLOT(callSearchMachine()));

tmr->start(5000); 

【问题讨论】:

  • g_clickedObj.readFlag == 1 ; -- 这不可能是代码,因为您使用的是== 而不是=
  • 如果您在计时器所在的同一线程中设置变量,我不明白您为什么需要QTimer 来定期检查其值。相反,设置变量可能会发出一个信号,并且插槽(连接到此信号)可能会启动计时器以等待 5 秒,直到弹出消息框。如果变量可以/将在另一个线程中设置,那将是一个不同的故事......SO: How to alter Qt Widgets in WINAPI threads?

标签: c++ qt qtimer


【解决方案1】:

方案一: 使用一个间隔为 100ms 的定时器来检查全局变量,持有一个成员变量来计算定时器槽被调用的次数。当 slot 调用 5000/100=50 次时,停止计时器并在必要时创建消息框。

void MyClass::onTimeout(){
    // check variable
    // increment counter
    // check if counter reached 5000/100
    // if so stop timer and create message box
}

选项 2: 使用两个计数器(一个间隔 100 毫秒,另一个间隔 5000 毫秒),它们有两个不同的插槽。同时启动两个计数器。让100ms定时器的槽检查全局变量,让5000ms定时器的槽停止两个定时器并检查全局变量,必要时创建消息框。

【讨论】:

  • 这些选项可以在我的应用程序的其他功能运行时工作吗?我的应用程序上有一个通信功能,该功能必须在应用程序运行期间一直运行。我尝试了这两个选项,但我的通信功能停止工作,直到计时器超时。
  • 在这种情况下,您应该将 QTimer 部分移动到另一个线程。你可以检查这个stackoverflow.com/a/19252927/12122790
【解决方案2】:

这对你有用吗?我没有看到需要每 100 毫秒检查一次,如果 readFlag 在 5 秒内没有设置为 1,则会输出错误消息,否则不会发生任何事情。

    // where you want to start the 5 second count down...
    QTimer::singleShot(5000, this, SLOT(maybePrintAnErrorMsg()));
    . . .

    // the slot:
    void MyClass::maybePrintAnErrorMsg()
    {
      if (readFlag != 1) {
        // show a QMessageBox;
      }
    }

    . . . somewhere else in your code, when you set readFlag to 1:

    if (case) {
      // when the timer goes off, we won't print an error message
      readFlag = 1;
    }

【讨论】:

  • 我想运行 slut 函数 5 秒。你展示的方式5秒后调用slut函数。
猜你喜欢
  • 1970-01-01
  • 2022-10-09
  • 2021-11-05
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多