я попытаюсь объяснить, что моя программа используется, чтобы сделать и то, что я Тринг изменить:QThread передачи данных и из
Я имел эту функцию, которая выбежала на кнопку мыши из главного потока в классе MainWindow : общественный 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 при его вычислении и ускорении. (Правильно ли это?)
Я хотел бы разделить мою сетку на равные части и передать этот диапазон вершин моей функции (выше), чтобы работать только с одним диапазоном вершин для отдельного протектора.
У меня есть проблема, чтобы выяснить, как передать эти данные и сделать их потокобезопасными. Я знаю его много кода, но вот моя попытка решить ее:
Проблема получает все данные вокруг в правильном направлении, и получать потоки работать. Где я должен использовать мьютексы. На всех данных, которые могут быть записаны во время работы потока с помощью mainthread? Очень смущенный. ти
редактировать:
Я отредактировал мой код: 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 размораживает
Любые идеи, почему?
edit2:
Я снял несколько пробегов в том же потоке, перемещая это конструктор класса:
connect(this, SIGNAL(startMake1(cadData)), cThreads.at(0), SLOT(MakeMesh(cadData)));
//...
cThreads.at(0)->moveToThread(threads.at(0));
//...
threads.at(0)->start();
Вам нужно будет выяснить, что вы замерзаете самостоятельно, используя отладчик или профилировщик, или путем разгона вызовов на printf() или qDebug или т. Д., Чтобы увидеть, где приостановлено выполнение в потоке графического интерфейса. Вы также можете поместить некоторые вызовы printf («% i \ n», (int) pthread_self()) как в коде GUI, так и в коде mesh-worker, чтобы убедиться, что код сети действительно работает в отдельном потоке, как ожидалось , –