2015-10-10 50 views
-1

我试着在我的窗口小部件上使用一个简单的QTimer对象,以便我可以计算一个方法完成所花费的时间。但令我惊讶的是,定时器被阻塞,直到方法完成执行!即当有关方法结束时,计时器开始计时!QTimer为什么不是异步的?

这里是一个示例代码来演示一下我写的:

#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继承和我的孩子课堂上使用定时器或做我必须从QTimer继承和有线程执行在它!这真是令人困惑!

+0

什么是QThread :: sleep(5)'? –

+0

模拟工作方法! – Breeze

+2

你确定你不是在寻找'QElapsedTime'吗? 'QTimer'用于在一段时间过后触发某些工作。 – peppe

回答

5

这是Qt的共同的行为,的WinForms,WPF等

所有UI相关的事件一个接一个地在UI线程上同步执行。事件处理程序不会执行很长的执行以避免阻塞。如果你想执行一个很长的任务,你应该在其他线程中完成。

QTimer旨在引发UI线程上的事件。这很好,因为您确信此刻没有其他事件处理程序正在执行。

+0

就我所知,这不是WinForms的常见行为。 WinForms Timer在其线程中运行,并与UI线程平行运行。 首先,Qt和WinForms之间的这种差异产生了混淆。 (对我的愚见来说,这对于定时器在UI线程中首先运行甚至是不合逻辑的!) – Breeze

+1

@Hossein,你错了。 WinForms Timer也在UI线程上运行。 https://msdn.microsoft.com/en-us/library/system.windows.forms.timer%28v=vs.110%29.aspx –

+0

非常感谢,不知道,我不知道如何WinForm的计时器工作(也许在后台调用processEvent()!) Anywa,我将不胜感激,看看如何将Qthreads与定时器结合起来,我是否必须从Qthreads继承并在我的子类中使用timer,或者是否必须从QTimer继承有一个线程执行它! 它真的让人困惑! – Breeze