我将尝试解释我的程序曾经做什么以及我想要改变什么:
我有这个函数,它在 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 分钟)并且会阻塞 gui。
我想做的是拥有与 QThread::idealThreadCount() 一样多的线程,并在计算时释放 gui 并使其更快。(这是正确的想法吗?)
我想将我的网格分成相等的部分,并将这个顶点范围传递给我的函数(上图),以便仅使用一个顶点范围来实现单独的胎面。
我很难弄清楚如何传递这些数据并使其成为线程安全的。我知道它有很多代码,但这是我解决它的尝试:
问题是以正确的方式获取所有数据并让线程工作。我必须在哪里使用互斥锁。在主线程工作时可以写入的每个数据上?很困惑。泰
编辑:
我编辑了我的代码: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 也冻结了。流程如下:
- 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();