2015-10-10 83 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