2015-05-22 64 views
0

嗨我想在Qt的控制檯應用程序中創建線程。Qthread調用只運行一次

我的主要方法是:

#include<featurematcher.h> 
#include<QCoreApplication> 

    int main(int argc, char *argv[]) 
    { 
     QCoreApplication a(argc, argv); 

     FeatureMatcher * fm = new FeatureMatcher(); 

     fm->start(); 

    return a.exec(); 

} 

我FeatureMatches類如下:

#ifndef FEATUREMATCHER_H 
#define FEATUREMATCHER_H 
#include<QThread> 

class FeatureMatcher:public QThread 
{ 
    Q_OBJECT 
public: 
    FeatureMatcher(); 
    void run(); 
}; 

#endif // FEATUREMATCHER_H 

和CPP文件:

#include "featurematcher.h" 
#include <iostream> 
FeatureMatcher::FeatureMatcher() 
{ 
} 


void FeatureMatcher::run() 
{ 
    std::cout<<"Process"<<std::endl; 
} 

我的問題是,當我開始運行程序它只調用run方法一次。我期待輸出爲無限數量的「process」打印出來,但它是打開的打印一次。 我在哪裏失蹤?

+0

你想用QThread解決什麼問題?如果您期望重複調用run,則可能完全不需要該線程,而是使用QTimer。 – simon

+0

線程只能運行'run'一次。如果你想多次執行任務,你將需要一個循環。 – Alexander

+0

@亞歷山大謝謝。我在圖形用戶界面上使用線程。在那裏,它正在調用運行本身,但後來我才知道這是因爲GUI正在重新繪製自己並一次又一次地調用線程。 –

回答

1

首先,它一般是not a good idea to inherit QThread。但是,如果你必須這樣做,你必須自己實現循環。你可以用兩種方法做到這一點。

您可以創建一個QTimer,然後運行QThread::exec

void FeatureMatcher::run() 
{ 
    this->moveToThread(this); 

    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), SLOT(onTimer())); 
    timer->setInterval(1000); 
    timer->start(); 
    exec(); 
} 

,或者你可以創建一個無限循環:

void FeatureMatcher::run() 
{ 
    while (1) { 
     std::cout<<"Process"<<std::endl; 
    } 
} 

更新第一個例子#2。

+0

你的第一個例子不正確。 'onTimer'插槽不會在'FeatureMatcher'線程上下文中執行。 – hank

+0

@hank:謝謝,很久沒有用過了。更新的例子。 – Amartel

+0

我正要嘗試在while循環中使用。但是我在一個gui應用程序中使用了線程,我不需要使用任何循環。一旦我開始線程,它的運行函數每次都被調用。在控制檯和GUI應用程序上線程是否有區別? –

1

雖然我同意Amartel上面所說的(「不是一個好主意繼承QThread」)。它仍然是一個選擇。

如果你仍然要繼承的QThread(你真的,也許並不需要)試試這個:

#ifndef FEATUREMATCHER_H 
#define FEATUREMATCHER_H 
#include<QThread> 

class FeatureMatcher:public QThread 
{ 
    Q_OBJECT 
public: 
    FeatureMatcher(); 
    void loopRun(); 
private: 
    void run(); 
}; 

#endif // FEATUREMATCHER_H 

然後添加looprun()函數到您的.cpp文件:

#include "featurematcher.h" 
#include <iostream> 
FeatureMatcher::FeatureMatcher() 
{ 
} 

void FeatureMatcher::run() 
{ 
    std::cout<<"Process"<<std::endl; 
} 

void FeatureMatcher::looprun() 
{ 
    while(1){ 
     start(); 
    } 
} 

我希望我能夠幫助你。只有很少的情況下繼承QThread是有益的。

這是博客文章由誰與/幫助開發了QThread的模塊,它解釋了一些混亂的工作的球員之一:https://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

然而,這篇文章提出了一些論據反對總是使用工作線程,而不是子類QThreads :http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html

+1

run是受保護的虛擬,當你執行QThread :: start()時被調用。你不應該直接調用run。你的實現不是一個線程。 – Correa

+0

解決了這個問題。感謝您指出Correa!自從我做這種QThread實現以來,已經有一段時間了。 –