Qthread 冻结 MainWindow

Qthread freezing MainWindow

我对 QThread 有疑问。假设我想创建一个 class-thread,这将使一些计算无限时间。如果我发送信号,线程将停止计算并执行某些操作。

// Class-线程

class A: public QThread
{
    protected:
      void run() { exec(); }
      public slots:
      void calc() { while (true) {do somethning}}
      void display() { display something }
}

// Class 主要 window

class MainWindow 
{
    void buttonClick() {emit signalDisplay() }
}

// 主文件

void main()
{
   A * a = new A;
   a->start();
   a->calc();

   MainWindow w;
   connect(&w, SIGNAL(signalDisplay()), a, SLOT(display()));
   w.show();
}

问题是如果我调用 a->calc() 它会冻结应用程序。但我认为它是分开工作的?或者我错过了什么?

所以你在你的 class A 中使用了第二种重新实现 QThread 的方法。我认为你必须将你的计算代码放入 运行() 函数然后调用 a->start( );添加一些信号,例如 A::jobDone(bool success) 等

当您直接从主线程调用 a->calc() 时,它当然会在您调用它的线程中执行。在这种方法中,只有 运行() 函数在另一个线程中执行线程,这必须以 a->start() 开始。检查 docs 有很好的例子..

还有一个方法:

class A : public QObject {
..
public slots:
  void calc();
}


void main()
{
   QThread workerThread;
   A * a = new A;
   a->moveToThread(workerThread);
   a->start();

   MainWindow w;
   connect(&w, SIGNAL(startProcessing()), a, SLOT(calc()));
   connect(a, SIGNAL(jobFinished(QByteArray)), &w, SLOT(displayInGuiResults(QByteArray)));
   emit w.startProcessing();

   w.show();
}