Qt仿真循环

时间:2017-10-05 05:43:30

标签: c++ multithreading qt user-interface

我必须为作业创建一个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;
}

1 个答案:

答案 0 :(得分:2)

您可以使用信号和插槽。

在GUI中,您将GUI项目发出的信号(按钮,行编辑等)连接到执行业务逻辑的自定义插槽。例如,按下时按钮会发出clicked信号。

如果插槽中业务逻辑的处理已终止,则会发出另一个信号,该信号连接到窗口小部件中用于更新GUI的插槽。

如果GUI挂起,即业务逻辑的处理花费太多时间,则必须启动另一个线程来执行业务逻辑。 信号和插槽也适用于线程。

<强>参考