2011-05-24 34 views
0

嗨 我在QT 4.6.2中實現了一個簡單的線程化GUI應用程序。我正在使用QThread沒有繼承它。我在start()函數中調用了usleep()函數,但這會導致GUI凍結。我如何解決這個問題。下面是代碼qthread塊中的睡眠呼叫塊UI線程

#ifndef ECGREADER_H 
#define ECGREADER_H 
#include<QObject> 
class ecgreader : public QObject 
{ 
    Q_OBJECT 

public: 
    ecgreader(QObject *parent=0); 
    ~ecgreader(); 
public Q_SLOTS: 
    void start(); 
Q_SIGNALS: 
    void finished(); 
}; 
#endif // ECGREADER_H 

下面是start()函數

void ecgreader::start() 
{ 
    int i= system("ls>output.txt"); 
    SLEEP(10000); 
    if(i==0) 
    { 
     emit finished(); 
    } 
} 

終於開始呼叫這裏

void Application::onbtnclicked() 
{ 
    QThread* thread=new QThread; 
    ecgreader* reader=new ecgreader; 
    reader->moveToThread(thread); 
    connect(thread,SIGNAL(started()),reader,SLOT(start())); 
    connect(reader,SIGNAL(finished()),thread,SLOT(quit())); 
    connect(reader,SIGNAL(finished()),reader,SLOT(deleteLater())); 
    connect(reader,SIGNAL(finished()),thread,SLOT(deleteLater())); 
    reader->start(); 
} 

取得請幫

回答

2

你有兩個問題:首先你創建了線程,但你從來沒有開始過。其次,您直接在您的閱讀器上調用start()而不是發出信號。

我想你的意思是叫thread-> start()方法,而不是閱讀器 - >開始():

void Application::onbtnclicked() 
{ 
    QThread* thread=new QThread; 
    ecgreader* reader=new ecgreader; 
    reader->moveToThread(thread); 
    connect(thread,SIGNAL(started()),reader,SLOT(start())); 
    connect(reader,SIGNAL(finished()),thread,SLOT(quit())); 
    connect(reader,SIGNAL(finished()),reader,SLOT(deleteLater())); 
    connect(reader,SIGNAL(finished()),thread,SLOT(deleteLater())); 
    thread->start(); 
}