0

GUI アプリケーションで実行するのに非常に時間のかかるタスクがいくつかあり、GUI がフリーズしないようにそれらをスレッド化したい..

そのために、スレッドを作成し、タイマーを開始しました。スレッドの「実行」メソッドで、timeout() メソッドをタイマーから、並列化したい時間のかかる関数に接続しましたが、シグナルが呼び出されると、代わりに時間のかかる関数がメイン スレッドで呼び出されます。私が作成したものの。

例のために簡略化された私のコードは次のとおりです。

void MyThread::run()
{
   m_pTimer = new QTimer()
   connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeConsumingMethod()));
   m_pTimer->start(x);
}

「timeConsumingMethod」、MyThread::run()、およびメインに静的メソッド QThread::currentThread() の値を出力しましたが、その値はメインのものと同じです。

関数を別のスレッドで実行するにはどうすればよいですか? さらに重要なのは、なぜ私のコードが間違っているのですか?

4

1 に答える 1

0

「あなたはそれを間違っています。」:)

これを試して:

myworker.h

#include ...

class MyWorker : public QObject {
   Q_OBJECT
public:
   explicit MyWorker(QObject* parent = 0);
public slots:
   void timeConsumingMethod();
}

myworker.cpp

#include "myworker.h"

#include ...

MyWorker::MyWorker(QObject* parent) : 
   QObject(parent) 
{
   /*
   ...
   */
}

void MyWorker::timeConsumingMethod() {
   /*
   ...
   */
}

コード

/*...*/
MyWorker* worker = new MyWorker();
QThread* workerThread = new QThread();
QTimer* timer = new QTimer();


worker->moveToThread(workerThread);
worker->connect(timer, SIGNAL(timeout()), SLOT(timeConsumingMethod()));

// don't forget proper obj deletion
// not the best way, but...
worker->connect(workerThread, SIGNAL(destroyed()), SLOT(deleteLater());

workerThread->start();
timer->start(x);

その場合、worker は workerThread に「住んでいます」。QT SIGNAL-SLOT メカニズムは、異なるスレッド内のオブジェクト間の接続をサポートします。

run() メソッドと QThread 継承を再実装することにより、「手続き的な方法」よりもはるかに優れたアプローチ

ワーカーは動作し、QThread はスレッドを制御します

ソース: http://qt-project.org/wiki/Threads_Events_QObjects

于 2013-04-19T12:02:52.790 に答える