gpt4 book ai didi

c++ - QThread 来回传递数据

转载 作者:行者123 更新时间:2023-11-28 03:35:00 25 4
gpt4 key购买 nike

我将尝试解释我的程序曾经做什么以及我想改变什么:

我在类 MainWindow 中的主线程单击按钮时运行了这个函数:public QMainWindow:

函数看起来像这样并且在另一个文件中指定:

void MakeMeshStructure(MeshStructureLayers layers,
Handle_AIS_InteractiveContext theContext,
Handle_TDocStd_Document aDoc,
MyMesh &mesh,
int detail_vertex,
double insulation_thickness,
OpenMesh::VPropHandleT<MyMesh::Scalar> _max_beam_offset);
}

它的作用是:它在网格上工作,并为网格的每个顶点、面和边创建几何体。该几何与上下文一起显示。此过程需要很长时间(30 分钟)并阻止图形用户界面。

我想做的是拥有与 QThread::idealThreadCount() 一样多的线程,并在计算时释放 gui 并使其更快。 (这是正确的想法吗?)

我想将我的网格分成相等的部分,并将这一范围的顶点传递给我的函数(上图),以便仅使用一个顶点范围来处理单独的胎面。

我有一个问题要弄清楚如何传递这些数据并使其线程安全。我知道它的很多代码,但这是我尝试解决它的尝试:

http://pastebin.com/u/mzagar

问题是以正确的方式获取所有数据并让线程工作。我必须在哪里使用互斥锁。在主线程线程工作时可以写入的每个数据上?很困惑。型

编辑:

我编辑了我的代码:http://pastebin.com/u/mzagar我制作了一个 struct cadData 来传递数据。这就是我启动线程的方式:

connect(this, SIGNAL(startMake1(cadData)), cThreads.at(0), SLOT(MakeMesh(cadData)));
//...
cThreads.at(0)->moveToThread(threads.at(0));
//...
threads.at(0)->start();
//...
emit startMake1(aCadDatas.at(0));
//...

问题是线程似乎不能同时工作,并且图形用户界面也会卡住。流程是这样的:

  • GUI 卡住
  • 线程 1 中的事情已完成
  • 线程 1 中的事情再次完成
  • 线程 2 中的事情完成
  • 线程 2 中的事情再次完成
  • ...
  • GUI 解冻

有什么想法吗?

编辑2:

我通过将其移动到类构造函数来删除同一线程的多次运行:

connect(this, SIGNAL(startMake1(cadData)), cThreads.at(0), SLOT(MakeMesh(cadData)));
//...
cThreads.at(0)->moveToThread(threads.at(0));
//...
threads.at(0)->start();

最佳答案

由于您正在使用 QThread,您可能可以通过使用 Qt 的线程安全槽和信号机制来为您完成工作,从而避免显式使用互斥锁等。您基本上会将需要发送到线程的数据打包到一个对象中,然后发出一个将该对象作为参数的信号。该线程将在插槽中接收该对象的拷贝(您之前已连接到您的信号),然后开始使用数据。要将数据从工作线程返回到主线程,您需要以相反的方式再次执行相同的操作。 Here's一篇带有一些示例代码的文章。

关于c++ - QThread 来回传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196006/

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