2011-05-24 35 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(); 
}