C++ Qt仿真回路
我必须为作业创建cookie工厂模拟程序。程序的GUI使用普通的Qt小部件(例如:标签、按钮和行编辑)来控制模拟变量和对象。我已经创建了GUI,但我不知道如何进行模拟 我们的老师建议使用线程(每台机器一个)。我读过QThread,但是(从这里)得到的印象是,它们并不适合从其他线程访问对象,我也不知道如何创建或处理它们 但是,模拟非常简单(我相信)只需要一个循环(一个线程)就可以完成,但是我不知道如何在QMainWindow类中创建这个循环 所以,我的主要问题是:如何运行一个可以访问GUI、可以被GUI访问(以便它可以更改机器的值)以及可以访问机器的循环?我真的不知道如何连接GUI和模拟 谢谢,很抱歉发了这么长的邮件 编辑#1:我正在尝试执行的操作的伪代码:C++ Qt仿真回路,c++,multithreading,qt,user-interface,C++,Multithreading,Qt,User Interface,我必须为作业创建cookie工厂模拟程序。程序的GUI使用普通的Qt小部件(例如:标签、按钮和行编辑)来控制模拟变量和对象。我已经创建了GUI,但我不知道如何进行模拟 我们的老师建议使用线程(每台机器一个)。我读过QThread,但是(从这里)得到的印象是,它们并不适合从其他线程访问对象,我也不知道如何创建或处理它们 但是,模拟非常简单(我相信)只需要一个循环(一个线程)就可以完成,但是我不知道如何在QMainWindow类中创建这个循环 所以,我的主要问题是:如何运行一个可以访问GUI、可以被
// 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,这取决于您的需要。为了给你一个想法,我编辑了这篇文章,并添加了一个线程开始循环的例子。