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();
}
我对 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();
}