![]() |
|
|
![]()
|
|
| loneybibi |
|
||||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Добрый день!
Первый раз пробую что такое потоки. Так что сильно не ругать! Собственно вот класс потока:
В главном потоке с GUI перед его удалением выполняю выход из потока:
Но почему то все равно пишет ошибку и выход из потока не происходит:
Да и собственно само приложение теперь завершается очень долго после QMainWindow::close() проходит около 4 секунд. Объясните где тут ошибка и что тут не так пожалуйста! Прикрепил проект на всякий случай! Это сообщение отредактировал(а) loneybibi - 24.1.2012, 12:24 Присоединённый файл ( Кол-во скачиваний: 3 )
untitled1.zip 2,14 Kb-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Может дело и не в этом, но классы, наследуемые от QObject (а твой mThread такой, т.к. наследуется от QThread, который наследуется от QObject), так вот, такие классы должны быть описаны в отдельном h-нике. Это нужно для moc-компилятора.
Короче, попробуй вынести объявление mThread в отдельный h-ник и включи его в mainwindow.h -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Попробовал все тоже самое. -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| kuzulis |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
А если в run() оставить только:
то что? Скорее всего это изза:
Зачем использовать указатель на объект, созданный в другой нити из главной нити? Если уж создал QSqlDatabase, QSqlTableModel в mThread то они там и должны оставаться, не нужно выносить "мусор из избы" (с) А хотя, може быть, из-за того, что некому делать db.close()... Ты повыкидывай (позакомментируй) в run() разные строчки и узнаешь из-за чего. Это сообщение отредактировал(а) kuzulis - 24.1.2012, 13:07 |
||||
|
|||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Если оставить только это то все нормально.
Есть QMainWindow на нем QTableView. Раньше это все было в главном потоке. Но так как процесс выборки данных довольно длительный и интерфейс подвисает при этом, я решил вынести выборку данных в отдельную нить, дабы дать пользователю работать дальше а не ждать пока запрос данных закончится. Если оставлять все внутри нити то как тогда задать для QTableView модель данных ? Или как тогда это правильно сделать ? Я думаю тут делать закрытие соединения не прицепиально т.к. объект создан в стеке, да и db.close ничего не меняет. И если бы соединение не закрывалось то на консоль был бы характерный вывод о том что соединение все еще используется. Это сообщение отредактировал(а) loneybibi - 24.1.2012, 13:39 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| loneybibi |
|
||||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
В справке по Qt функция run() переопределялась как public:
Открыл вторую редакцию книги Макса Шлее по Qt. Увидел что там в примере, функция run() переопределяется как protected:
Вообщем перенес свою функцию в protected и все работает как часы:
Всем спасибо! Это сообщение отредактировал(а) loneybibi - 24.1.2012, 14:14 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||||
|
|||||||
| Sahab |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 1.9.2009 Репутация: 2 Всего: 3 |
без разницы протектед или паблик. видимо изменил что-то ненароком)
Добавлено через 2 минуты и 59 секунд мало того, на куте-лабсе был пост о том, что не нужно так делать. правильно - создавать объект db (инкапсулирующий работу с БД) и moveToThread ( QThread * targetThread ) в необходимый поток. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
в исполняемом коде эти надписи
абсолютно одинаковы. Проверь - измени сейчас в рабочем коде обратно protected на public и всё будет работать -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| loneybibi |
|
||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Я конечно не совсем уверен но они точно имеют различия. По логике зачем бы тогда был раздел ptotected и public. И извините меня конечно то тот проект что я выложил в первом посте и в конечно что я описал ничем не отличается кроме того что я перенес функцию run() в раздел protected!! Если мне не верите просто возьмите код из первого моего проекта и перенесите функцию run() в раздел protected! Просто проверьте! Я благодарен за ответы и я только начал изучать нити но это действительно так! Добавлено @ 22:19 Смыла врать мне нет. borisbn возьмите мой код и он будет работать с ошибкой. А если изменить на протектед то все ок ! Просто попробуйте! Win xp sp3 qt 4.7.4 Это сообщение отредактировал(а) loneybibi - 24.1.2012, 23:45 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||
|
|||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
поясните примером пожалуйста как инкапсулировать и как переместить поток ! ? про инкапсуляции в поток и тд я еще не в курсе т.к. только начал изучать нити как и сказал выше ! Буду благодарен за примеры ! Это сообщение отредактировал(а) loneybibi - 24.1.2012, 23:48 -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
извините.
Фух че то я запутался! очистил проект. перенес обратно в паблик функцию run(). собрал, все работает! но код тот же ! почему не работало до этого не понял вообще не понял! не менял ничего честно ! объясните пожалуйста тогда в чем разница между public и protected если для компилятора это один и тот же код ? только в зоне видимости объектов? -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Разница только в том, выдавать ли ошибку при компиляции, если кто-то пытается вызвать protected-функцию снаружи (или при private-наследовании... брррр...). В исполняемом же коде (ессно, если скомпилировалось без ошибок) разницы нет вообще никакой -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Скажите пожалуйста как получить результат завершения потока? Я в потоке в случае заверщения вызываю функцию exit(int), аргумент есть код возврата, мне нужно от потока получить этот код.
|
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
В переопределении функции run() есть exec() который запускает очередь сообщений потока вот она и возвращает код возврата, как в main.cpp функции main() в принципе. -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
loneybibi, я не понял, зачем exec возврашать? Это же eventloop, или я чего то недопонимаю..
Запускаю поток, в котором нет бесконечного цикла, и exec я не использую, но в случае ошибки поток прерывает работу с помошью метода exit(int), нужно как только поток завершил работу, приложение, которое его запустило, должно проанализировать ошибку и выдать сообщение юзеру что произошла авария в работе потока. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |