Qt并发运行成员函数从另一个成员函数



我想在一个单独的线程中启动一个成员函数,从另一个成员调用它。也许下面的代码更清晰。

在线程中有一个启动计数器的按钮,它起作用了:

void MainWindow::on_pushButton_CountNoArgs_clicked()
{
   myCounter *counter = new myCounter;
   QFuture<void> future = QtConcurrent::run(counter, &myCounter::countUpToThousand);
}

MyCounter类成员函数:

void myCounter::countUpToHundred()
{
   for(int i = 0; i<=100; i++)
   {
      qDebug() << "up to 100: " << i;
   }
}

void myCounter::countUpToThousand()
{
   for(int i = 0; i<=1000; i++)
   {
      qDebug() << "up to 1000: " << i;
      if (i == 500)
      {
          //here I want to launch myCounter::countUpToHundred() in another thread
      }
   }
}

假设您想并行运行两个计数器,那么您有3个线程:

线程1:ui线程(或主线程)

这里运行on_pushButton_CountNoArgs_clicked()。你不应该在这个函数中做太多的工作,因为如果你想达到每秒60帧,你只有16毫秒的时间来完成所有的工作。启动一个新线程来运行countUpToThousand()是个好主意。

线程2:后台线程(由QtConcurrent启动,运行countUpToThousand)

这与线程1并行运行,并且您正在使用myCounter的相同实例(即内存中的相同位置),因此要小心您读取和写入的成员变量。

线程3:后台线程(由QtConcurrent启动,运行countUpToHundred)

开始使用(如hank指出的)

void myCounter::countUpToThousand()
{
   for(int i = 0; i<=1000; i++)
   {
      qDebug() << "up to 1000: " << i;
      if (i == 500)
      {
          QtConcurrent::run(this, &myCounter::countUpToHundred);
      }
   }
}

将与线程1和线程2并行运行。

现在你可能会得到像988n99n这样疯狂的输出结果,当一个计数器是999而另一个是88时,因为线程2和线程3将同时打印到控制台,而不关心其他线程在做什么。

还请注意,在线程2和线程3完成之前,您必须不要删除counter,因为您这样做,它们仍然会尝试访问内存,您的应用程序可能会崩溃。

最新更新