Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?
Здравствуйте, delphinchik, Вы писали:
D>Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?
Выполнять запросы в отдельном потоке.
См. TThread, есть стандартные примеры
Здравствуйте, delphinchik, Вы писали:
D>Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?
А почему бы не делать менее громоздкие запросы?
Сложность запроса не обязывает его быть длительным, если, конечно,
с проектированием все в порядке.
Здравствуйте, delphinchik, Вы писали:
D>Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?
Есть более интерсный выход из положения.
Существует 2 вида сединения в сервером БД : синхронный и асинхронный.
При синхронном соединении программа всегда ждет завершения выполненя запроса (виснет). При асинхронном программа посылает запрос и сразу продолжает работать дальше. Когда асинхронный запрос выполнен генерируется соответствующее событие.
Примеры для TADOConnection:
Connection->ConnectOptions = coAsyncConnect; // устанавливает асинхронный режим
Connection->OnConnectComplete = ConnectionConnectComplete; // это событие будет выполняться при завершении запроса.
// Пример тела события
void __fastcall TReconnectionBox::ConnectionConnectComplete(TADOConnection*,
const _di_Error Error, TEventStatus &EventStatus)
{
ShowMessage("Запрос выполнен");
}
// Вызов запросса как обычно...
TADOQuery * query = new TADOQuery;
qyery->Connection = Connection;
query->SQL->Add("select * from table");
query->Open();
// После query->Open() прога пойдет дальше не дожидаясь окончания выполнения запроса.
P.S. Примеры даны для c++Builder, но я уверен, что такое есть в Delphi.
Спасибо за ответ. Единственный вопрос заключается в том, что я не использую ADO-компоненты. Но, думаю, в других тоже что то должно быть, обязательно посмотрю.
Здравствуйте, Bander, Вы писали:
B>Connection->ConnectOptions = coAsyncConnect; // устанавливает асинхронный режим B>Connection->OnConnectComplete = ConnectionConnectComplete; // это событие будет выполняться при завершении запроса.
Уверен, что это даст требуемый эффект? В MSDN сказано, что опция coAsyncConnect применяется к открытию соединения (Connection.Open), а событие OnConnectComplete возникает при установке соединения. Для асинхронного выполнения запросов предназначена опция adAsyncExecute при вызове Recordset.Open
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, delphinchik, Вы писали:
D>>Единственный вопрос заключается в том, что я не использую ADO-компоненты.
W>А чем ты пользуешься?