![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависание формы [D7]
Proz2 © (2005-07-07 14:48:00)Запускаем SQL запрос. Во время его выполнения форма перестает отвечать. Application.ProcessMessages не помогает, в т.ч. по таймеру. Threads не предлагать, т.к. поток нужен всего один, а как определить его завершение я не знаю. Delphi 7.
Proz2 (2005-07-07 17:21:00) [1]Огромнейшие спасибо и респект!
Digitman (2005-07-07 17:05:00) [2]var
hThread: THandle;
..
MyThread := TMyThread.Create(Query);
try
hThread := MyThread.Handle;
while not Application.Terminated do
case MsgWaitForMultipleObjects(1, hThread, False, INFINITE, QS_ALLINPUT) of
...
Proz2 (2005-07-07 16:54:00) [3]Очень благодарен, стал немного понимать, только вот:
case MsgWaitForMultipleObjects(1, MyThread.Handle,* False, INFINITE, QS_ALLINPUT) of
[Error]:Constant object cannot be passed as var parameters
* - указано, где компилятор устанавливает курсор.
Digitman (2005-07-07 16:41:00) [4]примерно так это может выглядеть :
type
TMyThread = class(TThread)
private
FQuery: TQuery;
protected
procedure Execute; override;
public
constructor Create(Query: TQuery);
end;
..
constructor TMyThread.Create(Query: TQuery);
begin
FQuery := Query;
inherited Create(False);
end;
procedure TMyThread.Execute;
begin
Query.Open;
end;
..
var
MyThread: TMyThread;
for a:=1 to listbox.items.count-1 do
begin
DBGrid.DataSource.DataSet := nil;
Query.SQL.Text='select * from table where username=[+listbox.items[a]];
MyThread := TMyThread.Create(Query);
try
while not Application.Terminated do
case MsgWaitForMultipleObjects(1, MyThread.Handle, False, INFINITE, QS_ALLINPUT) of
WAIT_OBJECT_0: break;
WAIT_OBJECT_0 + 1: Application.ProcessMessages;
end;
finally
MyThread.Free;
end;
DBGrid.DataSource.DataSet := Query;
showmessage('ok');
end;
Proz2 (2005-07-07 16:31:00) [5]Пардон за чайниковость. Если не сложно, то увидеть бы это дело с описанием type, constructor и прочими объявлениями. Нашел в интернете единственный пример применения threads, повторяющийся на многих страницах, но в том виде он у меня не работает.
На самом деле, мне нужно следующее:
Есть список username'-ов, беру первое, делаю запрос, вываливаю его в dbgrid. Во время выполнения запроса, основная форма должна отвечать. Пока не выполнится запрос и не закроется поток, следующий запрос выполнятся не должен. Когда запрос отработает первое имя, форма модифицируется, и выполняется следующий username. Т.е. что-то в виде:
for a:=1 to listbox.items.count-1 do
begin
Query.SQL.Text='select * from table where username=[+listbox.items[a]];
Query.Open;
showmessage('ok');
end;
Только чтобы форма отвечала во время выполнения запроса.
Digitman (2005-07-07 16:11:00) [6]MyThread := TMyThread.Create(...);
try
while not Application.Terminated do
case MsgWaitForMultipleObjects(1, MyThread.Handle, False, INFINITE, QS_ALLINPUT) of
WAIT_OBJECT_0: break;
WAIT_OBJECT_0 + 1: Application.ProcessMessages;
end;
finally
MyThread.Free;
end;
Proz2 (2005-07-07 16:06:00) [7]трэда
Digitman (2005-07-07 15:35:00) [8]
> Именно
что "именно"-то ?
именно "трэда" или именно "исполнения запроса" ?
Proz2 (2005-07-07 15:29:00) [9]> кого "его" ? трэда ? исполнения запроса ?
Именно
Digitman (2005-07-07 14:52:00) [10]
> Threads не предлагать, т.к. поток нужен всего один
либо применяй асинхронные запросы (если СУБД позволяет), либо нужен более чем один трэд, либо - смирись
> как определить его завершение я не знаю
кого "его" ? трэда ? исполнения запроса ?