gpt4 book ai didi

c++ - 连续运行代码,直到按下 "Stop"

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:15 24 4
gpt4 key购买 nike

我想在按下“开始”按钮时执行一些代码,它会继续运行直到我按下“停止”按钮。

但是,使用下面的代码,一旦我按下“开始”,我就不能再按下“停止”了:

void MainWindow::on_pushButton_clicked()
{
if (ui->pushButton->text()=="Start") {
ui->pushButton->setText("Stop");

vec spectrum_sensed,Sn,sigma,alpha;
mat ydata;
condition=true;
while (condition) {
cvec uhd_samples = to_cvec(randn(Nsamples),randn(Nsamples));
ydata=spectrum->dft(uhd_samples,Ndft,Nband);

myplot->Plot_data(spectrum_sensed,Ndft);
}
}
else {
ui->pushButton->setText("Start");
condition=false;
myplot->clear_plot();
}
}

最佳答案

Qt 的 GUI 在单线程中运行,如果您的代码阻塞了该线程,鼠标点击之类的事情将永远无法处理(因为该线程正忙于计算您的数据),因此您的 GUI 会卡住。

至于如何更改程序以免发生这种情况,您有几种选择:

  1. 您可以在计算循环中调用 qApp->processEvents()。这样 Qt 将有机会在您计算时处理诸如鼠标点击之类的事情。这是最简单的方法,但如果你不小心,它可能会伤害你——例如,如果你设置了一些其他代码,鼠标点击导致你的 MainWindow 被删除,那么你很可能会崩溃因为在 processEvents() 返回后,它发现自己在现已删除的 MainWindow 对象 (!) 的 on_pushButton_clicked() 方法中执行。

  2. 您可以生成一个单独的线程(使用 QThread 对象)并在那里运行您的计算循环。这可能是最有效的方法,因为在多核 CPU 上,它会让 GUI 事件循环在一个内核上运行,而计算循环同时在另一个内核上运行,因此两个循环都不会减慢另一个的速度。请注意,此方法仅在您的计算循环不涉及任何 Qt GUI 内容时才有效——Qt 的 GUI 小部件只能由 GUI 线程访问,并且如果您尝试从不同的线程检查或修改它们,不好的事情会发生。

  3. 您可以“展开”循环,使其不再是同步循环,而更像是状态机:也就是说,移动计算的状态变量(spectrum_sensed、Sn、sigma、alpha 和ydata) 脱离方法,因此它们现在是 MainWindow 类的成员变量。然后编写一个 Slot 方法,它只执行 while 循环的一次迭代(或者可能是少量迭代,具体取决于每次迭代需要多长时间),然后(在几十毫秒内)调用 QTimer::singleShot(0, this , SLOT(TheCalculationSlotMethodName()) 并返回。QTimer::singleShot() 调用将导致您的计算槽方法在 Qt 事件循环的下一次迭代中再次被调用,因此它可以做更多的计算。当用户单击“停止”按钮时,只需将您的 on_stopButton_Pushed() 插槽设置为 bool 值或其他内容,这样您的计算方法就知道不再调用 QTimer::singleShot() 了。我喜欢这种方法,因为风险很小竞争条件或重入问题。

关于c++ - 连续运行代码,直到按下 "Stop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518091/

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