Russian Qt Forum

Qt => Общие вопросы => Тема начата: Antiglobalist от Май 14, 2010, 14:37



Название: Потоки - как , что
Отправлено: Antiglobalist от Май 14, 2010, 14:37
Пытался сам разобраться с потоками , но результат был не очень , нуждаюсь в советах.
Есть программа с архитектурой модель-вид-контроллер , которая рисует графики и сохраняет данные в вектор.
Я в мэйн файле создаю 3-и объекта (Мод Вид Контр) И прописываю там между ними связи через сигналы и слоты.
В моделе есть вектор в который записываются данные.

Теперь основное , нужно создать поток в который мы закидываем указатель на вектор и в онлайн режиме должен строиться график по значениям интеграла функций из вектора.
ВОт, мне нужна подсказка где его создать и как соединить , пробывал в мeйн файле создавать объект класса Thread, но при задержке(usleep();) вставала вся программа ...
В самом потоке создаю объект аналог Вид'а и осуществляю обмен информацией с моделью.

Если где-то про это подробно написано , прошу дайте почитать :)


Название: Re: Потоки - как , что
Отправлено: ритт от Май 14, 2010, 15:59
а поиск по форуму ничего не дал?


Название: Re: Потоки - как , что
Отправлено: Antiglobalist от Май 14, 2010, 17:32
А Если в потоке есть цикл , и я вызываю сигнал который принимает слот quit() в потоке , цикл закончит свою работу вместе с потоком или только поток остановится ?


Название: Re: Потоки - как , что
Отправлено: ритт от Май 14, 2010, 18:58
судя по документации (и, тем более, по коду), произойдёт выход из всех экземпляров QEventLoop данного потока, что обычно означает и останов самого потока.


Название: Re: Потоки - как , что
Отправлено: Igors от Май 14, 2010, 20:09
В любом случае нитка запускается методом start() завершается когда выходит из своего метода run(). Широко применяются 2 политики:

1) Перекрыть run() для выполнения конкретной задачи (обычно одной). Как прервать нитку в данном случае, дождаться ее завершения и.т.п - см. по форуму, обсуждалось неск. раз недавно.

2) По умолчанию) run() вызывает exec(), нитка входит в свой eventLoop  Она будет что-то делать когда получит сигнал (event) из другой. Вызов quit() закончит eventLoop, произойдет выхо из run() - нитка завершена.

По Вашей задаче (насколько я понял). В самых общих чертах: я бы запускал нитку(и) в начале работы и завершал через quit() при выходе (метод 2). Посылал бы ей сигнал "вычислить график". Напр. с параметром "указатель на контейнер". Нитка посчитала, заполнила контейнер и отсигналила "готово" - главная рисует результаты в UI. Проще создать коннекты сигналов с типом QueuedConnection