Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QtConcurrent:通知另一个函数结果已就绪 我是C++和QT世界的新手。我需要对现有的控制台应用程序进行一些修改_C++_Qt - Fatal编程技术网

QtConcurrent:通知另一个函数结果已就绪 我是C++和QT世界的新手。我需要对现有的控制台应用程序进行一些修改

QtConcurrent:通知另一个函数结果已就绪 我是C++和QT世界的新手。我需要对现有的控制台应用程序进行一些修改,c++,qt,C++,Qt,我有以下问题:我同时运行一些函数(需要一些时间),并在此期间显示等待指示器。设置如下所示: QFuture<void> doStuff = QtConcurrent::run(longCalc, param1, param2); showWaitIndicator(&doStuff); // .... void showWaitIndicator(QFuture<void> *future) { while (future->isRunning(

我有以下问题:我同时运行一些函数(需要一些时间),并在此期间显示等待指示器。设置如下所示:

QFuture<void> doStuff = QtConcurrent::run(longCalc, param1, param2);
showWaitIndicator(&doStuff);

// ....

void showWaitIndicator(QFuture<void> *future)
{
    while (future->isRunning()) {
        // Show some nice indicator and so on.
    }
}
QFuture doStuff=QtConcurrent::run(longCalc,param1,param2);
showWaitIndicator(&doStuff);
// ....
无效showWaitIndicator(QFuture*未来)
{
while(future->isRunning()){
//显示一些漂亮的指示器等等。
}
}
这个设置工作得很好,但是现在我想同时运行一些其他任务,这些任务有另一个返回类型,我需要访问结果。而不是
QFuture
,它们主要是
QFuture
QFuture
,等等:
QFuture doStuff=QtConcurrent::run(doubleCalc)

我还想显示我的尼斯等待指示器,但不同的返回类型意味着我不能使用当前的
showWaitIndicator()
函数

有没有一个好的方法来改进这个“设置”?我对C++很陌生,所以我肯定一定有办法。我的第一个想法是函数重载,但这不起作用,因为参数具有相同的类型(QFuture)


TL;DR:我需要通知我的
showWaitIndicator()
函数QFuture已完成。

您可以从并发运行的函数发出自定义信号,或者使用
QFutureWatcher
作为此类信号的源

例如,当
longCalc
处于同一类别时:

MyClass::MyClass() {
  Q_OBJECT
  Q_SIGNAL void longCalcDone();
  connect(this, &MyClass::longCalcDone, this, [this]{
    ...
  });
}
void MyClass::longCalc(int arg1, int arg2) {
  ...
  emit MyClass::longCalcDone();
}
例如,当
longCalc
是一个自由函数或在另一个类中时:

void longCalc(int, int);

MyClass::MyClass() {
  Q_OBJECT
  Q_SIGNAL void longCalcDone();
  connect(this, &MyClass::longCalcDone, this, [this]{
    ...
  });
  void doStuff() {
    QtConcurrent::run([=]{
      longCalc(param1, param2);
      emit longCalcDone();
    });
  }
}
例如,改用未来的观察者:

class MyClass : public QObject {
  QFutureWatcher watcher;

  MyClass() {
    connect(&watcher, &QFutureWatcher::finished, this, [this]{
      ...
    });
  }

  void doStuff() {
    auto future = QtConcurrent::run(longCalc, this, param1, param2);
    watcher.setFuture(&future);
  }
};
while(future->isRunning())
同步代码是一种反模式。假设您在该循环中调用
QCoreApplication::processEvents
。问题是——世界不是这样的,你不能把控制点从事件循环中移开,假装世界围绕着你转。相反,将控制流反转,并在将来完成时调用代码(插槽、方法或函子)


另请参见。

只需检查Qt上的信号和插槽。当Qfuture完成任务时,应该触发一个信号,您可以将其与SLOTAh perfect连接。插槽和信号是我一直在寻找的:)