首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用QtConcurrent::作为槽运行

调用QtConcurrent::作为槽运行
EN

Stack Overflow用户
提问于 2022-01-14 22:39:16
回答 1查看 99关注 0票数 0

我正在尝试调用异步函数,比如时隙,但是当我单击按钮时,什么都不会发生。

代码:

代码语言:javascript
复制
connect(ui->Button1, SIGNAL(clicked()), this, SLOT(QtConcurrent::run(func1)));

func是在私人位置声明的。

当我正常调用函数时,一切都很正常,但是应用程序在一段时间内被冻结,直到函数完成。

代码语言:javascript
复制
connect(ui->Button1, SIGNAL(clicked()), this, SLOT(func1()));
EN

回答 1

Stack Overflow用户

发布于 2022-01-15 10:04:07

connect具有隐式Qt::ConnectionType参数。当发送方和接收方处于不同的线程中时,它将被定义为Qt::QueuedConnection。您可以使用QObject::moveToThread将worker移动到另一个线程。

如果出于某种原因,您需要在这里使用QtConcurrent::run --您可以在func1实现中使用它。

检查这两个版本:

代码语言:javascript
复制
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的连接方式。关于这个主题的更多信息,这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70717293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档