c++ - QThread 来回传递数据

标签 c++ multithreading qt

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

我在类 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/

相关文章:

java - mmap() vs Java MappedByteBuffer 性能?

c++ - 复制语句如何识别其构造函数

c++ - 为什么所有内核上的 sin(Vector) 可以和一个内核上的 sin(V) 一样快?

c# - 使用 C# 和 WinForms 在与主窗体不同的线程上创建新的临时窗体

线程中的 QTimer - 事件未处理?

c++ - OpenGL 3.3 - 2 个三角形的不同旋转

c++ - 读取给定路径中保存的 EVTX 文件

c# - 如何实现多线程并行执行多个任务?

qt - QGraphicsView 和 eventFilter

qt - 如何使用 Qt 安装 Windows 服务?