Russian Qt Forum

Qt => Базы данных => Тема начата: soiam от Май 23, 2013, 13:45



Название: [Решено]Можно ли убить процесс QSqlDatabase::open()?
Отправлено: soiam от Май 23, 2013, 13:45
Добрый день.
Осуществляется подключение к удаленной БД mysql
Код:
        remote_db.setDatabaseName("");
        remote_db.setPort(3306);
        remote_db.setHostName(remote_addr);
        remote_db.setPassword(pass);
        remote_db.setUserName(login);
        if (!remote_db.open())
        {
          ..............
        }
В случае отсутствия в онлайне сервера remote_addr, программа секунд 30 подвисает на функции  remote_db.open().
Пользователь ПО не хочет ждать это время, хочет нажать "Отмена подключения", чтобы подключение перестало устанавливаться. Что можно сделать для этого?


Название: Re: Можно ли убить процесс QSqlDatabase::open()?
Отправлено: Serr500 от Май 23, 2013, 14:09
Вывести подключение в отдельный поток. Он не будет тормозить ГУИ и его можно будет убить в любой момент. Но лучше не убивать, а дождаться ответа в фоновом режиме. ;)


Название: Re: Можно ли убить процесс QSqlDatabase::open()?
Отправлено: soiam от Май 23, 2013, 14:14
Подключение в отдельном от gui потоке. Но как мне его убить? вроде как объект же нельзя удалять во время вызова функции этого объекта.
Нюанс в том, что эта же программа у меня и для андроида, а open там в таком случае подвисает вообще намертво, а не на 30 секунд, как в windows и linux


Название: Re: Можно ли убить процесс QSqlDatabase::open()?
Отправлено: Kurles от Май 23, 2013, 22:02
Код
C++ (Qt)
void QThread::terminate () [slot]
.Но это плохой метод, надо дожидаться ответа от open(). Точно уверен, что подключение в другом потоке создается?


Название: Re: Можно ли убить процесс QSqlDatabase::open()?
Отправлено: soiam от Май 24, 2013, 09:36
Kurles, да, подключение и запросы передаются с помощью сигналов с одного потока в другой.
terminate действительно прибивает поток, немного пришлось повозиться с конструктором и деструктором БД в потоке, но в принципе теперь для пользователя всё работает, как надо. Правда, с точки зрения программиста уж очень криво... Возможна утечка памяти, смотря как драйвер mysql написан, но в принципе это исключительный случай

Спасибо