Название: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: lolobotik от Март 28, 2017, 14:37 Здравствуйте. Не совсем уверен был куда тему разместить, поправьте, если что не так.
Есть наброски программы для работы с базой данных. Под все sql'вские задачи вроде как думал выделить отдельный поток, чтоб совсем не зависнуть в случае чего. Объект класса sqlroutine с полем QSqlQueryModel и парочкой слотов/сигналов путём moveToThread засунут в отдельный тред. В GUI потоке есть некая форма с таблицей QTableView. В таблицу пока вычитывается по 20 (или меньше) записей, то есть записи выводятся постранично (страница для тестов - 20 записей). Запросы в БД делаются только по текущей странице. Переключение между страницами по кнопкам вперед/назад на форме. В main.cpp имеем: Код: sqlRoutine sql; К началу какого-либо взаимодействия между потоком с sqlroutine и таблицей TableView (из ClientBase CB) база уже открыта (плюс проверен логин/пароль на соответствие таковым в таблице базы). Выглядит таким образом: Код: db = QSqlDatabase::addDatabase("QODBC3"); Далее максимально упрощенные слоты. На стороне треда с SQL: Код: void sqlRoutine::RequestedClientsCount() Со стороны GUI: Код: void ClientBase::RefreshClientTableData(QString SqlError) На кнопках висят такие обработчики (в кратце - вычисляются нужные записи для страницы и шлётся сигнал в sqlRoutine): Код: void ClientBase::on_NextPageButton_clicked() Вот как-то так выглядит всё это дело. Теперь к проблеме. При переключении страниц с некоторой вероятностью (может после 3 нажатий на кнопку Вперед или Назад, может после 100) вылетает SegmentationFault. При этом косяк, судя по всему именно из-за нескольких потоков (что-то видно не стыкуется у меня), так как, если оставить всё в GUI'шном потоке, то все проблемы исчезают. Так же, при использование в конектах DirectConnection (что, насколько я понял, практически сводит всё опять же к 1 потоку). Буду очень благодарен, если кто-то либо укажет на явный косяк, либо подскажет, куда рыть. С Model/View и SQL на Qt не имею никакого опыта, с потоками опыт тоже крайне сомнительный, так что догадок особо нет. Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: Пантер от Март 28, 2017, 14:45 Модель нельзя в поток, ибо вьюха ее напрямую дергает. Ты попробовал без потока обойтись прежде чем такое городить?
Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: lolobotik от Март 28, 2017, 15:01 Модель нельзя в поток, ибо вьюха ее напрямую дергает. Ты попробовал без потока обойтись прежде чем такое городить? Изначальный посыл был в том, чтобы при "протупке" sql'вских запросов не вешать интерфейс. В частности, пока делал авторизацию, выяснил, что некоторые вещи (а ля остутсвие сервера по нужному адресу) блокируют поток примерно на минуту, что не есть хорошо. Вот и решил вынести всё это дело. Как выводить всё считанное добро в таблицу стал думать уже подобравшись поближе к самой таблице (про model/view вообще слыхом не слыхивал, так что спланировать не мог заранее). Так что нет, не пробовал. Попытался навесить на сделанный ранее кусок то, что описал в посте. Уже постфактум старался вычитать что-то по поводу корректности распихивания моедльки и вьюхи в ранзые потоки - писали, что в принципе всё Неужто так категорично всё (нельзя)? И если да, то, может посоветуете чего для такого разнесения по потокам. Можно, конечно вручную расковыривать query и переписывать данные в свой буфер, но думаю, это не самый правильный вариант. Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: Пантер от Март 28, 2017, 15:32 Наличие сервера можно отдельно проверять. ODBC плохой выбор, лучше использовать нормальный драйвер. Что за БД?
Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: lolobotik от Март 28, 2017, 15:48 Наличие сервера можно отдельно проверять. ODBC плохой выбор, лучше использовать нормальный драйвер. Что за БД? SQL Server 2008. ODBC по принципу "что не надо было доприкручивать то и взял" используется. Он же вроде стандартно к винде приклеен? Ну а по поводу "наличия сервера": нет уверености, что затуп может только при его отсутствии произойти (а отсутвие опыта не даёт предсказать, где он вообще возможен). Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: Пантер от Март 28, 2017, 16:04 ODBC лучше не использовать, ИМХО. БД тебе навязана или можно выбрать другую?
Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: lolobotik от Март 28, 2017, 16:07 ODBC лучше не использовать, ИМХО. БД тебе навязана или можно выбрать другую? Крутится уже на сервере с другими базами. Поднимать еще 1 вряд ли станут. Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: Пантер от Март 28, 2017, 16:11 Я с MSSQL не работал, но с постгресом затупов никаких не было. Главное, не делать огромные выборки.
Название: Re: Segmentation fault. QSqlquerymodel + QTableView в разных потоках. Отправлено: lolobotik от Март 28, 2017, 16:25 Я с MSSQL не работал, но с постгресом затупов никаких не было. Главное, не делать огромные выборки. Ясно. Ну буду надеяться, что у меня тоже не возникнет. Большие объёмы за раз вроде не планирую выжимать. Пока повешу на слоты с обновлением модели Qt::DirectConnection для блокировки гуишного потока до выполнения кода с слотах. Так оно вроде не шалит. Если всплывёт еще что-то - тогда уж в один поток всё засуну и буду думать, что с этим делать. Спасибо за пояснения. |