Название: Запросы к БД из трэда и зависание. Отправлено: Пантер от Ноябрь 17, 2008, 12:39 БД - постгрес. Вот трэд:
Код: #ifndef QALARMCHECK_H Код: #include <QtGui> Код: message type 0x43 arrived from server while idle И иногда, после таких вот сообщений, любое обращение к БД из основного окна приводит к зависанию. Название: Re: Запросы к БД из трэда и зависание. Отправлено: Rcus от Ноябрь 17, 2008, 13:41 "Иногда" в многопоточном приложении это конечно не смешно, вы как-нибудь контроллируете очередность использования подключения потоками?
Цитировать Threads and the SQL Module A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported. In addition, the third party libraries used by the QSqlDrivers can impose further restrictions on using the SQL Module in a multithreaded program. Consult the manual of your database client for more information Название: Re: Запросы к БД из трэда и зависание. Отправлено: BRE от Ноябрь 17, 2008, 13:46 Это цитата из документации http://www.crossplatform.ru/documentation/qtdoc4.3/threads.php
Цитировать Потоки и модуль SQL Ты же пытаешься использовать соединение созданное в главном потоке, внутри своего потока.Соединение может использоваться только внутри создавшего его потока. Перемещение соединений между потоками и создание запросов в другой поток не поддерживается. Кроме того, библиотеки третьих лиц, используемые драйверами QSqlDriver могут наложить дополнительные ограничения на использование Модуля SQL в многопоточной программе. За дополнительной информацией обращайтесь к создателю клиента базы данных. Попробуй создавать еще одно соединение внутри своего потока и использовать его. Название: Re: Запросы к БД из трэда и зависание. Отправлено: Rcus от Ноябрь 17, 2008, 14:03 Ты же пытаешься использовать соединение созданное в главном потоке, внутри своего потока. Я как-то пытался использовать подобный подход (система плагинов, каждый плагин выполнялся в отдельном потоке и каждому нужно было общаться с базой). Но для каждого подключения постгрес создает отдельный процесс, что не слишком хорошо сказывается на потреблении памяти (если экземпляров приложения*потоков мало то можно забить).Попробуй создавать еще одно соединение внутри своего потока и использовать его. В моей задаче проще оказалось использовать одно подключение, а потокобезопасность обеспечивать QMutex+QMutexLocker Название: Re: Запросы к БД из трэда и зависание. Отправлено: Пантер от Ноябрь 17, 2008, 18:11 Всем спасибо. Я с трэдами раньше не работал, поэтому так протупил. Теперь все нормально работает и не виснет (создаю подключение в потоке), но все таки в консоль периодически вываливается
message type 0x43 arrived from server while idle message type 0x5a arrived from server while idle message type 0x43 arrived from server while idle message type 0x5a arrived from server while idle Что бы это значило? Название: Re: Запросы к БД из трэда и зависание. Отправлено: pastor от Ноябрь 17, 2008, 18:26 Что бы это значило? Попробуй спросить у гугла (http://www.google.ru/search?hl=ru&newwindow=1&as_qdr=all&q=message+type+arrived+from+server+while+idle&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=). По это й проблеме много страниц Название: Re: Запросы к БД из трэда и зависание. Отправлено: Kolobok от Апрель 25, 2010, 16:26 У меня проблема противоположная. Я использую одно соединение в нескольких потоках и все работает стабильно. Прочитал в асистенте этот абзац и удивился. Что я делаю не так? База sqlite.
|