0

こんにちは、QT 4.6.2 でシンプルなスレッド GUI アプリケーションを実装しています。サブクラス化せずに QThread を使用しています。start() 関数で usleep() 関数を呼び出しましたが、GUI がフリーズします。どうすればこれを回避できますか。以下はコードです

#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();
}

助けてください

4

1 に答える 1

2

2 つの問題があります。最初にスレッドを作成しましたが、開始したことはありません。次に、シグナルを発行する代わりに、リーダーで直接 start() を呼び出しています。

あなたの意図は、reader->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();
}
于 2011-11-08T13:59:05.117 に答える