如何从QThread调用类成员函数?

时间:2016-04-28 09:29:19

标签: c++ multithreading qt qt-creator qthread

我正在尝试创建一个类(如果可能的话,这个方式)将在一个单独的线程中运行。我找到的所有示例都显示了一个工作线程,它在工作完成后退出(在一个函数中):

void Worker::doWork()
{
    for (int i = 0; i <= 10; i++) {
        emit updateCount(i);
        qApp->processEvents();
        sleep(1000);
    }
    emit finished();
}

在这个例子中,据我所知,线程在发出'完成'信号后退出。 我想要做的是:

  • 创建一个帖子;
  • 创建一个工人类对象;
  • 使用moveToThread();
  • 将对象移动到线程
  • 然后我希望类对象坐在另一个线程中,什么都不做,直到main 程序从类中调用函数。

我将这段代码汇总在一起:

worker.h

class Worker : public QObject {
    Q_OBJECT

public:
    Worker();
    ~Worker();

public slots:
    void process();
    void TestFunc();
    void Kill();

signals:
    void finished();
};

worker.cpp

//constructor{..}
//destructor{..}

void Worker::process() {
    qDebug("Hello World!");
}

void Worker::TestFunc()
{
    int n=0;
    while(n<10)
    {
    qDebug("Hello World from testfunc");
    n++;
    Sleep(1000);
    QCoreApplication::processEvents();
    }
}

void Worker::Kill()
{
emit finished();
}

的main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int eh;
    QThread* thread = new QThread;
    Worker* worker = new Worker();
    worker->moveToThread(thread);

    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

    thread->start();
    worker->TestFunc();
    scanf("%i",&eh);
    worker->Kill();

    return a.exec();
}

问题是在我调用'worker-&gt; TestFunc()'之后,主线程(控制台窗口)被阻止,即在TestFunc完成之前我无法输入任何内容。

我确定我做错了,但我无法弄清楚这样做的正确方法。请引导我走向正确的方向。

0 个答案:

没有答案