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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Асинхронная работа с базой данных  (Прочитано 4680 раз)
White Owl
Гость
« : Январь 11, 2011, 00:14 »

Враппер над стандартным QtSQL.
Позволяет запускать запросы к базе в фоне и либо сидеть в цикле while(db->isBusy()){...} либо ждать получения сигнала done();
Поддерживается мульти-рекордсетная работа.
Нету привязки параметров. Возможно будет в будущем...
Багов вроде нет, но все возможно.
Записан
twp
Гость
« Ответ #1 : Январь 11, 2011, 13:50 »

Это жесть
Код:
connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(waitForWorkersCloser()));
...
void AsynchDB::waitForWorkersCloser() {
delete this;
}
Что будет если AsynchDB был создан в стеке или скажем таким образом:

Код:
	QScopedPointer<AsynchDB> db(new AsynchDB);

Кроме того, где тут асинхронизм?

Код:
void AsynchDB::execute(const QString &query, bool waitForIt) {
if(waitForIt) {
QEventLoop loop;
connect(m_worker, SIGNAL(done()), &loop, SLOT(quit()));
emit executeInWorker( query );
loop.exec();
} else {
emit executeInWorker( query );
while(!m_worker->isBusy());
}
}
если метод
Код:
const bool AsynchDB::isBusy() {
return busy || m_worker->isBusy();
}
то полюбому ждем завершения выполнения запроса, так?

Ну, а это вообще без комментариев:
Код:
void AsynchDB::execute(const QString &query, bool waitForIt) {
if(waitForIt) {
QEventLoop loop;
connect(m_worker, SIGNAL(done()), &loop, SLOT(quit()));
emit executeInWorker( query );
loop.exec();
} else {
emit executeInWorker( query );
while(!m_worker->isBusy());
}
}

const QSqlError& AsynchDB::lastError() {
return m_worker->lastError();
}

const Recordsets& AsynchDB::recordsets() {
return m_worker->recordsets();
}

const Recordset& AsynchDB::recordset(const int recordsetNumber) {
return m_worker->recordsets().at(recordsetNumber);
}


const bool AsynchDB::isBusy() {
return busy || m_worker->isBusy();
}

const bool AsynchDB::isOpen() {
return !busy && m_worker->isOpen();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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