【问题标题】:trying to get a running time stamp on Qt试图在 Qt 上获得运行时间戳
【发布时间】:2015-08-28 23:07:21
【问题描述】:

我试图每隔这么多毫秒保持一个运行时间戳。这最终将附加到温度读数。现在时间戳只在我的程序的其余部分运行后显示,我需要它实时填充。我使用 QTimer 更新的代码是

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT());

//delay set to space out time readings, can be adjusted
timer->start(750);

//Gets the time    
QTime time = QTime::currentTime();

//Converts to string with chosen format    
QString sTime = time.toString("hh:mm:ss:ms");

//displays current time in text edit box    
ui->tempTimeNoHeatMode->append(sTime);
//Pre heat turns on for selected # of seconds
   digitalWrite(2,1);
   delay(preHeat * 1000);
   digitalWrite(2,0);


   //Set loop to run while flow time is not 0
   while(flowTime > 0)
 {

   displayCurrentTime();

   //set zero pin to be high while flowtime is more than 0
   digitalWrite(0,1);

   flowTime--;

   // set second pin LED to flash according to dutyCycle
       digitalWrite(2,1);
       delay(onTime);
       digitalWrite(2,0);
       delay(offTime);

 }

 //turn zero pin low after flow time reaches 0
 digitalWrite(0,0);

}

代码控制两个 LED 来代表我项目后期的加热器和水流。我使用的是QtCreator 4

【问题讨论】:

    标签: c++ qt while-loop


    【解决方案1】:

    UI 不更新的原因是您从未将控制权交给事件循环,因此主线程在您的代码执行之前没有机会更新 UI。

    这里有两种可能的解决方案:

    1. 将现有代码移动到background thread,当时间改变时,signal 会触发。然后在主线程中,将该信号连接到更新 UI 的插槽。
    2. 不要循环调用 delay(),而是将所有这些代码放入一个函数或方法中,并使用 QTimer 让它每 750 毫秒执行一次。

    【讨论】:

    • 我最喜欢方法 (2),但为了完整起见,还有(hack-ish)方法 #3:从 while 循环内部调用 qApp->processEvents()
    • 我尝试使用 QTimer,但它仍然只有在整个代码运行后才会填充。
    • 您的更新比原来的问题更多——您不仅仍然阻止事件循环运行,而且现在您添加了一个未连接到任何插槽的 QTimer。
    • 我修复了不调用插槽的问题,只是看了看。有时间运行只需要重做我的一些其他逻辑谢谢大家。
    猜你喜欢
    • 2022-10-09
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多