6

GUI アプリケーションを作成するために Qt を使用しています。

メイン スレッドは GUI を担当し、オブジェクトを操作するために QThread を作成します。

class Worker
{
    void start() {
        QTimer* timer = new Timer();
        connect(timer,SIGNAL(timeout()),this,SLOT(do()));
    }

    void do() {
        //do some stuff
        emit finished();
    }
}



class GUI
{
    //do some GUI work then call startWorker();

    void startWorker() {
        QThread* thread = new Thread();
        Worker* worker = new Worker();

        worker->moveToThread(thread);

        connect(thread, SIGNAL(started()), worker, SLOT(start()));
        connect(worker, SIGNAL(finished()), workerthread, SLOT(quit()));
        connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
    }
}

今、私はいくつかの問題を抱えています:

  1. ワーカー クラスのタイマーが機能しません。新しいスレッドにイベントループがないためかもしれませんが、そのようなものを作成する方法がわかりません。私は試した

    connect(workerthread, SIGNAL(started()), workerthread, SLOT(exec()));

    しかし、それも機能しません。

  2. 新しいスレッドで待機しようとすると、シグナルが送信されません

    class GUI
    {
        void exit() {
            thread->wait();
        }
    }
    

イベントループがなく、そのためにシグナルが発せられていないことも原因だと思います。

これらの問題を解決する方法を知っている人はいますか?

4

2 に答える 2

2

タスククラスがqrunnableとqobjectから継承するよりも、qthreadpoolを使用しないのはなぜですか。この方法では、シグナルとスロットを使用して、あるスレッドから別のスレッドにデータを渡すことができ、実装がはるかに簡単で、スレッドを再作成しないか、一人はずっと寝ている

class myTask : public QObject, public QRunnable{
Q_OBJECT

protected:
void run(); //where you actually implement what is supposed to do

signals:
void done(int data);//change int to whatever data type you need

}

//moc click example, or use a timer to call this function every x amount of time
void button_click(){
   myTask *task = new myTask();
   task->setAutoDelete(true);
   connect(task,SIGNAL(done(int)),this,SLOT(after_done(int)),Qt::QueuedConnection);
   QThreadPool::globalInstance()->start(task);
}

デフォルトでは、アプリケーションは自動的に 1 つのスレッドを取得します。これを使用してグラフィックを処理できます。qthreadpool を使用してオンデマンドでデータ/オブジェクトを処理するよりも、アプリケーションが新しい要求を処理するために使用できるスレッドの最大量を設定することもできます。他のスレッドは、1 つのスレッドが解放されるまでキューに留まります

QThreadPool::globalInstance()->setMaxThreadCount(5);
于 2013-04-02T22:09:41.707 に答える
2

これはあなたのためのサンプルコードです:

QThread* thread = new QThread();
Worker* worker = new Worker(3000);
worker->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), worker, SLOT(start()));
thread->start();`

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(qint32,QObject *parent = 0);
    qint32 myTime;

signals:
    void   workFinished();

public slots:
    void doWork();
    void start();
    private:
    QTimer *timer;
};


#include "worker.h"
#include <QTimer>
#include <QDebug>
Worker::Worker(qint32 t,QObject *parent) :
    QObject(parent)
{
    myTime=t;
}

void Worker::start()
{
    timer = new QTimer();
    timer->start(myTime);
    qDebug()<<QString("start work in time:%1").arg(myTime);
    connect(timer,SIGNAL(timeout()),this,SLOT(doWork()));
}

void Worker::doWork()
{
    qDebug()<<"dowork";
    timer->stop();
    emit workFinished();
}

Debug結果 :

start work in time:3000

これがお役に立てば幸いです。

于 2013-04-03T04:04:59.983 に答える