Russian Qt Forum
Сентябрь 25, 2024, 02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Можно ли убить процесс QSqlDatabase::open()?  (Прочитано 3327 раз)
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().
Пользователь ПО не хочет ждать это время, хочет нажать "Отмена подключения", чтобы подключение перестало устанавливаться. Что можно сделать для этого?
« Последнее редактирование: Май 24, 2013, 09:38 от soiam » Записан
Serr500
Гость
« Ответ #1 : Май 23, 2013, 14:09 »

Вывести подключение в отдельный поток. Он не будет тормозить ГУИ и его можно будет убить в любой момент. Но лучше не убивать, а дождаться ответа в фоновом режиме. Подмигивающий
Записан
soiam
Гость
« Ответ #2 : Май 23, 2013, 14:14 »

Подключение в отдельном от gui потоке. Но как мне его убить? вроде как объект же нельзя удалять во время вызова функции этого объекта.
Нюанс в том, что эта же программа у меня и для андроида, а open там в таком случае подвисает вообще намертво, а не на 30 секунд, как в windows и linux
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #3 : Май 23, 2013, 22:02 »

Код
C++ (Qt)
void QThread::terminate () [slot]
.Но это плохой метод, надо дожидаться ответа от open(). Точно уверен, что подключение в другом потоке создается?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
soiam
Гость
« Ответ #4 : Май 24, 2013, 09:36 »

Kurles, да, подключение и запросы передаются с помощью сигналов с одного потока в другой.
terminate действительно прибивает поток, немного пришлось повозиться с конструктором и деструктором БД в потоке, но в принципе теперь для пользователя всё работает, как надо. Правда, с точки зрения программиста уж очень криво... Возможна утечка памяти, смотря как драйвер mysql написан, но в принципе это исключительный случай

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.