Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Зависание формы [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 не предлагать, т.к. поток нужен всего один


либо применяй асинхронные запросы (если СУБД позволяет), либо нужен более чем один трэд, либо - смирись


> как определить его завершение я не знаю


кого "его" ? трэда ? исполнения запроса ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо