gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:37:58 25 4
gpt4 key购买 nike

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

有一个按钮可以在一个线程中启动计数器并且它可以工作:

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
}
}
}

提前致谢。

最佳答案

假设你想并行运行 2 个计数器,你有 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 并行运行。

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

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

关于c++ - Qt从另一个成员函数并发运行成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com