C++ Qt仿真回路

C++ Qt仿真回路,c++,multithreading,qt,user-interface,C++,Multithreading,Qt,User Interface,我必须为作业创建cookie工厂模拟程序。程序的GUI使用普通的Qt小部件(例如:标签、按钮和行编辑)来控制模拟变量和对象。我已经创建了GUI,但我不知道如何进行模拟 我们的老师建议使用线程(每台机器一个)。我读过QThread,但是(从这里)得到的印象是,它们并不适合从其他线程访问对象,我也不知道如何创建或处理它们 但是,模拟非常简单(我相信)只需要一个循环(一个线程)就可以完成,但是我不知道如何在QMainWindow类中创建这个循环 所以,我的主要问题是:如何运行一个可以访问GUI、可以被

我必须为作业创建cookie工厂模拟程序。程序的GUI使用普通的Qt小部件(例如:标签、按钮和行编辑)来控制模拟变量和对象。我已经创建了GUI,但我不知道如何进行模拟

我们的老师建议使用线程(每台机器一个)。我读过QThread,但是(从这里)得到的印象是,它们并不适合从其他线程访问对象,我也不知道如何创建或处理它们

但是,模拟非常简单(我相信)只需要一个循环(一个线程)就可以完成,但是我不知道如何在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;
}

你可以使用信号和插槽

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

如果插槽中的业务逻辑处理已终止,您将发出另一个信号,该信号连接到小部件中的插槽,该插槽将更新GUI

如果GUI挂起,即处理业务逻辑需要太多时间,则必须启动另一个线程来执行业务逻辑。 信号和插槽也跨线程工作

参考资料

  • 文件
  • 方法的文档
  • a发出的信号列表
  • 。本页还包含对示例的引用
  • 线程在循环中运行的位置

我不确定我是否完全理解您的意图。可能会显示一些代码。根据这一点,我看到了不同的解决方案。可能:不要使用循环,而是使用信号和插槽。可能是:QCoreApplication::processEvents()(不)、QEventLoop、QThread::exec()、QObject::moveToThread()或QTimer::singleShot()。跨线程发送信号也可以。我将尝试添加一些伪代码。如果您决定不使用线程,我同意您的看法,在这里它们似乎没有必要,我建议您使用一组与插槽连接的QTimer,而不是sleep()。。。顺便说一句,在主线程中睡眠几乎从来都不是一个好主意。是的,我尝试在主线程中睡眠,这使GUI无法使用。1)您可以使用
QEventLoop
+
QTimer
(或其他信号提供程序)进行睡眠模拟。2) 您可以在循环中调用
QApplication::processEvents
,强制GUI响应。但这是一个糟糕的做法。使用插槽会不会有问题,因为模拟是连续运行的(只要没有按下暂停按钮)?无论如何,非常感谢你。我觉得自己有点傻。我将阅读您的链接。@sempiedram,这取决于您的需要。为了给你一个想法,我编辑了这篇文章,并添加了一个线程开始循环的例子。