我必须为作业创建一个cookie工厂模拟程序。程序的GUI使用常规Qt小部件(例如:标签,按钮和行编辑)来控制模拟变量和对象。我已经创建了GUI,但我不知道如何进行模拟。
我们的老师建议使用线程(每台机器一个)。我读过QThreads,但得到的印象(来自这个link)它们并不适合从其他线程访问对象,我真的不知道如何创建或处理它们。
然而,模拟很简单(我相信)它只能用一个循环(一个线程)完成,但我不知道如何在QMainWindow类中创建这个循环。
所以,我的主要问题是:如何运行可以访问GUI的循环,可以通过GUI访问(以便它可以更改机器的值),并可以访问机器?我真的不知道如何连接GUI和模拟。
谢谢,抱歉这篇长篇文章。
编辑#1:我正在尝试做的伪代码:
// Machines' initialization:
rawMaterialsTransport = new RawTransport();
doughMachine->conveyour = doughConveyour;
// Simulation loop:
lastTime = 0
while(running) {
// Handle pauses.
while(simulationPaused) {
sleep(100);
}
// Update machines/do the simulation
timePassed = now() - lastTime
lastTime = now()
rawMaterialsTransport->update(timePassed);
doughMachine->update(timePassed);
chocolateMachine->update(timePassed);
doughConveyour->update(timePassed);
// Update the GUI
chocolateGramsProcessedLabel->setText(to_string(chocolateMachine->gramsProcessed()));
// Sleep so as to not waste
sleep(100);
}
// On the GUI side:
onLineEditEnter() {
doughMachine->gramsPerSecond = double(lineEdit->text);
}
onPauseButtonPress() {
simulationPaused = !simulationPaused;
}
答案 0 :(得分:2)
您可以使用信号和插槽。
在GUI中,您将GUI项目发出的信号(按钮,行编辑等)连接到执行业务逻辑的自定义插槽。例如,按下时按钮会发出clicked
信号。
如果插槽中业务逻辑的处理已终止,则会发出另一个信号,该信号连接到窗口小部件中用于更新GUI的插槽。
如果GUI挂起,即业务逻辑的处理花费太多时间,则必须启动另一个线程来执行业务逻辑。 信号和插槽也适用于线程。
<强>参考强>