Название: Создание второго потока под вычисления. Отправлено: Crazy Sage от Марта 19, 2009, 09:43 Задача сделать программу в два потока, во втором - очередь вычислительных задач.
Вопрос первый: надо ли создавать отдельно поток под основную программу или если я из нее создам отдельно поток под вычисления все будет нормально? Вопрос второй: начал писать своего наследника QThread Код: class MThread : public QThread при наличии макроса Q_OBJECT выдает moc_mthread.cpp:54: error: 'staticMetaObject' is not a member of 'QThread' moc_mthread.cpp:72: error: 'qt_cast' is not a member of 'QThread' moc_mthread.cpp:77: error: 'qt_invoke' is not a member of 'QThread' moc_mthread.cpp:82: error: 'qt_emit' is not a member of 'QThread' moc_mthread.cpp:88: error: 'qt_property' is not a member of 'QThread' если его закомменить mthread.cpp:5: undefined reference to `vtable for MThread' mthread.cpp:5: undefined reference to `vtable for MThread' в чем ошибка? текст cpp файла: Код: MThread::MThread ( double x, unsigned int stackSize) :QThread( stackSize) Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 09:54 при наличии макроса Q_OBJECT выдает Пересобери проект: qmake && make И сразу вопросы по потоку... 1) Код
Это запуск потока на выполнение? Если да, то неверно. Для запуска потока нужно вызывать start 2) dlgMain - это что? Какой-то диалог с прогрессбаром? Снова неверно, во вспомогательном потоке нельзя работать с GUI. 3) Член "x" класса MThread незащищен объектом синхронизации Вывод: вспомогательный поток в текущем виде не работоспособен. Название: Re: Создание второго потока под вычисления. Отправлено: igor_bogomolov от Марта 19, 2009, 10:08 А что такое stackSize? И почему он в QThread передается?
Разве не обязан конструктор MThread приничать указатель на QObject, и передовать его дальше в QThread? Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 10:10 А что такое stackSize? И почему он в QThread передается? Разве не обязан конструктор MThread приничать указатель на QObject, и передовать его дальше в QThread? Очевидно Crazy Sage использует Qt3 Название: Re: Создание второго потока под вычисления. Отправлено: Crazy Sage от Марта 19, 2009, 10:21 И сразу вопросы по потоку... 3) Член "x" класса MThread незащищен объектом синхронизации Вывод: вспомогательный поток в текущем виде не работоспособен. проблемы с синхронизацией я буду решать уже потом, пока я просто пытаюсь сделать программу, в которой можно запустить второй поток, который будет считать что-то, перерисовывая прогресс бар не блокируя при этом работу основной программы Очевидно Crazy Sage использует Qt3 да и возможности перейти на qt4 у меня нет Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 10:42 это главное окно, в котором среди прочего есть прогрессбар. как тогда из вспомогательного потока по ходу выполнения менять значение прогрессбара? Передавать это значение в главный поток (GUI thread) при помоши custom event + QApplication::postEvent главному окну. Там (в главном потоке) его обрабатывать и устанавливать значение прогрессбару Название: Re: Создание второго потока под вычисления. Отправлено: Crazy Sage от Марта 19, 2009, 12:06 Насколько корректен такой вариант (если не считать абсолютно наплевательского отношения к целостности данных)
Код: ProgressEvent::ProgressEvent():QCustomEvent(progressChange) //в .h файле есть перечисление, в котором указан номер progressChange'а P.S. и еще, посоветуйте, как сделать паузу\возобновление потока посреди выполнения? и можно ли его остановить во время run если просто выполнить ему thread->terminate() Название: Re: Создание второго потока под вычисления. Отправлено: BRE от Марта 19, 2009, 12:21 P.S. и еще, посоветуйте, как сделать паузу\возобновление потока посреди выполнения? Не совсем понятно, приостановить выполнение во время расчета или между расчетами?и можно ли его остановить во время run если просто выполнить ему thread->terminate() А зачем убивать, если можно сделать флажок, который поток будет проверять в на каждой итерации и если надо выходить из цикла - завершая поток.Название: Re: Создание второго потока под вычисления. Отправлено: Crazy Sage от Марта 19, 2009, 12:31 Не совсем понятно, приостановить выполнение во время расчета или между расчетами? во время Название: Re: Создание второго потока под вычисления. Отправлено: BRE от Марта 19, 2009, 12:35 во время Поменяй, чуть чуть цикл: Код
Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 13:00 и можно ли его остановить во время run если просто выполнить ему thread->terminate() можно, но terminate использовать не желательно. Используй пару exit и wait Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 13:03 Конструкция вида:
Код
будет грузить проц. ТОгда уж так: Код
Название: Re: Создание второго потока под вычисления. Отправлено: BRE от Марта 19, 2009, 13:21 Код
Для этого случая, я бы наверное мьютекс задействовал. Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 13:40 pastor, ну это же был псевдокод, последние три строки в моем примере, некоторые компиляторы не пропустили бы. ;) Для этого случая, я бы наверное мьютекс задействовал. Тогда сорри ;) А идея с мютексом весьма неплохая :) Название: Re: Создание второго потока под вычисления. Отправлено: yesrus от Марта 19, 2009, 17:53 Посмотрите эту тему http://www.prog.org.ru/topic_8844_0.html - много вопросов прояснится(в частности лучше поток делать с эвент лупом(а не с бесконечным циклом) и передавать даннные на обработку с помощью сигналов...)
Название: Re: Создание второго потока под вычисления. Отправлено: pastor от Марта 19, 2009, 18:01 Посмотрите эту тему http://www.prog.org.ru/topic_8844_0.html - много вопросов прояснится(в частности лучше поток делать с эвент лупом(а не с бесконечным циклом) и передавать даннные на обработку с помощью сигналов...) Также нужно учесть что у автора Qt3, а не Qt4 Название: Re: Создание второго потока под вычисления. Отправлено: BRE от Марта 19, 2009, 18:05 Посмотрите эту тему http://www.prog.org.ru/topic_8844_0.html - много вопросов прояснится(в частности лучше поток делать с эвент лупом(а не с бесконечным циклом) и передавать даннные на обработку с помощью сигналов...) Это немного не его случай. ;) |