Разделение процессов
От: delphinchik Россия  
Дата: 19.11.04 07:29
Оценка:
Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?
Re: Разделение процессов
От: rockandroll Казахстан  
Дата: 19.11.04 08:15
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?


Выполнять запросы в отдельном потоке.
См. TThread, есть стандартные примеры
... << RSDN@Home 1.1.4 >>
Re: Разделение процессов
От: Leonid Troyanovsky  
Дата: 20.11.04 12:50
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Необходимо сделать так, что при выполнении одних операций программа не "висла" а отвечала на клики пользователя. Очень часто это бывает необходимо, когда программа выполняет какой то запрос к БД и если он достаточно сложный то на время его выполнения она подвисает. Как избавиться от этого?


А почему бы не делать менее громоздкие запросы?
Сложность запроса не обязывает его быть длительным, если, конечно,
с проектированием все в порядке.
--
С уважением, LVT
Re: Разделение процессов
От: Bander  
Дата: 21.11.04 07:51
Оценка: 9 (2) -1
Здравствуйте, 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.
Re[2]: Разделение процессов
От: delphinchik Россия  
Дата: 22.11.04 08:45
Оценка:
Спасибо за ответ. Единственный вопрос заключается в том, что я не использую ADO-компоненты. Но, думаю, в других тоже что то должно быть, обязательно посмотрю.
Re[2]: Разделение процессов
От: wildwind Россия  
Дата: 22.11.04 13:29
Оценка:
Здравствуйте, Bander, Вы писали:

B>Connection->ConnectOptions = coAsyncConnect; // устанавливает асинхронный режим

B>Connection->OnConnectComplete = ConnectionConnectComplete; // это событие будет выполняться при завершении запроса.

Уверен, что это даст требуемый эффект? В MSDN сказано, что опция coAsyncConnect применяется к открытию соединения (Connection.Open), а событие OnConnectComplete возникает при установке соединения. Для асинхронного выполнения запросов предназначена опция adAsyncExecute при вызове Recordset.Open
Re[3]: Разделение процессов
От: wildwind Россия  
Дата: 22.11.04 13:30
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Единственный вопрос заключается в том, что я не использую ADO-компоненты.


А чем ты пользуешься?
Re[4]: Разделение процессов
От: delphinchik Россия  
Дата: 22.11.04 16:30
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, delphinchik, Вы писали:


D>>Единственный вопрос заключается в том, что я не использую ADO-компоненты.


W>А чем ты пользуешься?


Компоненты ZEOS.
Re[5]: Разделение процессов
От: wildwind Россия  
Дата: 22.11.04 17:01
Оценка:
Здравствуйте, delphinchik, Вы писали:

D>Компоненты ZEOS.


Вот и смотри в документации, поддреживают ли они асинхронный режим. Если нет, то, как уже было сказано, выполняй запрос в отдельном потоке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.