我对QThread有个问题。假设我想要创建一个类线程,这将使一些计算的时间无限。如果我发送一个信号,线程将停止计算并执行某些操作。
//类-线程
class A: public QThread
{
protected:
void run() { exec(); }
public slots:
void calc() { while (true) {do somethning}}
void display() { display something }
}//类主窗口
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(),就会冻结应用程序。但我以为它是隔开的?还是我错过了什么?
发布于 2015-05-13 07:47:56
因此,在A类中使用第二种重新实现QThread的方法。我认为您必须将计算代码放入run()函数中,然后调用a->start();添加一些信号,如A::jobDone(bool )等等。
当然,当从主线程直接调用a->calc()时,它将在调用它的线程中执行。在这种方法中,只有run()函数在另一个线程中执行,这必须用->start()启动。检查一下文档有个很好的例子。
还有另一种方式:
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();
}https://stackoverflow.com/questions/30208322
复制相似问题