我正在尝试调用异步函数,比如时隙,但是当我单击按钮时,什么都不会发生。
代码:
connect(ui->Button1, SIGNAL(clicked()), this, SLOT(QtConcurrent::run(func1)));func是在私人位置声明的。
当我正常调用函数时,一切都很正常,但是应用程序在一段时间内被冻结,直到函数完成。
connect(ui->Button1, SIGNAL(clicked()), this, SLOT(func1()));发布于 2022-01-15 10:04:07
connect具有隐式Qt::ConnectionType参数。当发送方和接收方处于不同的线程中时,它将被定义为Qt::QueuedConnection。您可以使用QObject::moveToThread将worker移动到另一个线程。
如果出于某种原因,您需要在这里使用QtConcurrent::run --您可以在func1实现中使用它。
检查这两个版本:
class Worker : public QObject {
public:
void DoSlowCalculation() {
qDebug() << "Worker::DoSlowCalculation thread:" << QThread::currentThreadId();
QThread::msleep(2000); // 2 sec
qDebug() << "Worker::DoSlowCalculation finished";
}
};
class ConcurrentExecutor : public QObject {
public:
void DoSlowCalculation() {
qDebug() << "ConcurrentExecutor::DoSlowCalculation thread:" << QThread::currentThreadId();
QThread::msleep(2000); // 2 sec
qDebug() << "ConcurrentExecutor::DoSlowCalculation finished";
}
void DoSlowCalculationConcurrent() {
QtConcurrent::run(this, &ConcurrentExecutor::DoSlowCalculation);
}
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
qDebug() << "Main thread:" << QThread::currentThreadId();
QThread worker_thread;
Worker worker;
worker.moveToThread(&worker_thread);
worker_thread.start();
QPushButton btn;
btn.setText("Click to perform slow calculation");
QObject::connect(&btn, &QAbstractButton::clicked, &worker,
&Worker::DoSlowCalculation);
ConcurrentExecutor concurr_executor;
QObject::connect(&btn, &QAbstractButton::clicked, &concurr_executor,
&ConcurrentExecutor::DoSlowCalculationConcurrent);
worker_thread.start();
QObject::connect(&app, &QCoreApplication::aboutToQuit, &worker_thread,
&QThread::quit);
btn.show();
return app.exec();
}强烈建议停止使用信号和插槽宏,这是Qt4的连接方式。关于这个主题的更多信息,这里。
https://stackoverflow.com/questions/70717293
复制相似问题