我想在一个单独的线程中启动一个成员函数,从另一个成员调用它。 也许下面的代码更清楚。
有一个按钮可以在一个线程中启动计数器,它可以工作:
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
}
}
}
提前致谢。
答案 0 :(得分:1)
假设你想要并行运行2个计数器,你有3个线程:
主题1:UI-Thread(或主线程)
此处运行on_pushButton_CountNoArgs_clicked()
。你不应该在这个功能上做艰苦的工作,因为如果你想要达到每秒60帧,那么你所有的工作只需要16毫秒。开始一个新的线程来运行countUpToThousand()
是一个好主意。
线程2:后台线程(由QtConcurrent启动,运行countUpToThousand)
这与线程1并行运行,并且您正在使用myCounter的相同实例(即内存中的相同位置),因此请注意您读取和写入的成员变量。
线程3:后台线程(由QtConcurrent启动,运行countUpToHundred)
开始使用(正如汉克指出的那样)
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并行运行。
现在,当一个计数器位于999而另一个计数器位于88时,您可能会得到像988\n99\n
这样的疯狂输出结果,因为线程2和线程3将同时打印到控制台并且不关心什么另一个线程正在做。
另请注意,在线程2和线程3完成之前,您不能删除counter
,因为您仍然会尝试访问内存,您的应用程序可能会崩溃。