为什么 QTimer 不是异步的?
Why isn't QTimer asynchronous?
我尝试在我的 window 小部件上使用一个简单的 QTimer
object,以便我可以计算方法完成所用的时间。但令我惊讶的是,计时器被阻塞,直到方法完成执行!即当相关方法结束时,计时器开始计时!
这里有一个示例代码来演示我写的内容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_btnTest_clicked();
void OnTimerTick();
private:
Ui::MainWindow *ui;
ulong seconds;
};
#endif // MAINWINDOW_H
这是 cpp 文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv/cv.h"
#include <QTimer>
#include <QtCore>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnTest_clicked()
{
QTimer * timer = new QTimer(0);
seconds =0;
connect(timer,SIGNAL(timeout()),this,SLOT(OnTimerTick()));
timer->setInterval(100);
timer->start();
QThread::sleep(5);//simulating a method which takes 5 seconds to complete
//timer->stop();
}
void MainWindow::OnTimerTick()
{
ui->lblElapsedTime->setText(QString::number(++seconds));
}
我怎样才能获得异步行为,就像我们在 C# 中所拥有的那样,即定时器在其中运行自己的执行线程?
更新:
感谢您的澄清,现在我如何将 Qthreads 与计时器合并,我是否必须继承 Qthreads 并在我的 child class 中使用计时器,或者我是否必须继承 QTimer 并执行一个线程在里面!真是一头雾水!
这是 Qt、WinForms、WPF 等的常见行为。
所有与UI相关的事件都在UI线程上逐一同步执行。事件处理程序不应执行长时间执行以避免阻塞。如果你想执行一个长任务,你应该在其他线程中执行。
QTimer
旨在引发 UI 线程上的事件。这很好,因为您确定此时没有其他事件处理程序正在执行。
我尝试在我的 window 小部件上使用一个简单的 QTimer
object,以便我可以计算方法完成所用的时间。但令我惊讶的是,计时器被阻塞,直到方法完成执行!即当相关方法结束时,计时器开始计时!
这里有一个示例代码来演示我写的内容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_btnTest_clicked();
void OnTimerTick();
private:
Ui::MainWindow *ui;
ulong seconds;
};
#endif // MAINWINDOW_H
这是 cpp 文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv/cv.h"
#include <QTimer>
#include <QtCore>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btnTest_clicked()
{
QTimer * timer = new QTimer(0);
seconds =0;
connect(timer,SIGNAL(timeout()),this,SLOT(OnTimerTick()));
timer->setInterval(100);
timer->start();
QThread::sleep(5);//simulating a method which takes 5 seconds to complete
//timer->stop();
}
void MainWindow::OnTimerTick()
{
ui->lblElapsedTime->setText(QString::number(++seconds));
}
我怎样才能获得异步行为,就像我们在 C# 中所拥有的那样,即定时器在其中运行自己的执行线程?
更新:
感谢您的澄清,现在我如何将 Qthreads 与计时器合并,我是否必须继承 Qthreads 并在我的 child class 中使用计时器,或者我是否必须继承 QTimer 并执行一个线程在里面!真是一头雾水!
这是 Qt、WinForms、WPF 等的常见行为。
所有与UI相关的事件都在UI线程上逐一同步执行。事件处理程序不应执行长时间执行以避免阻塞。如果你想执行一个长任务,你应该在其他线程中执行。
QTimer
旨在引发 UI 线程上的事件。这很好,因为您确定此时没有其他事件处理程序正在执行。