Текущий архив: 2005.07.25;
Скачать: CL | DM;
Вниз
Зависание формы Найти похожие ветки
← →
Proz2 (2005-07-07 14:48) [0]Запускаем SQL запрос. Во время его выполнения форма перестает отвечать. Application.ProcessMessages не помогает, в т.ч. по таймеру. Threads не предлагать, т.к. поток нужен всего один, а как определить его завершение я не знаю. Delphi 7.
← →
Digitman © (2005-07-07 14:52) [1]
> Threads не предлагать, т.к. поток нужен всего один
либо применяй асинхронные запросы (если СУБД позволяет), либо нужен более чем один трэд, либо - смирись
> как определить его завершение я не знаю
кого "его" ? трэда ? исполнения запроса ?
← →
Proz2 (2005-07-07 15:29) [2]> кого "его" ? трэда ? исполнения запроса ?
Именно
← →
Digitman © (2005-07-07 15:35) [3]
> Именно
что "именно"-то ?
именно "трэда" или именно "исполнения запроса" ?
← →
Proz2 (2005-07-07 16:06) [4]трэда
← →
Digitman © (2005-07-07 16:11) [5]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:31) [6]Пардон за чайниковость. Если не сложно, то увидеть бы это дело с описанием 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:41) [7]примерно так это может выглядеть :
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:54) [8]Очень благодарен, стал немного понимать, только вот:
case MsgWaitForMultipleObjects(1, MyThread.Handle,* False, INFINITE, QS_ALLINPUT) of
[Error]:Constant object cannot be passed as var parameters
* - указано, где компилятор устанавливает курсор.
← →
Digitman © (2005-07-07 17:05) [9]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 17:21) [10]Огромнейшие спасибо и респект!
Страницы: 1 вся ветка
Текущий архив: 2005.07.25;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.011 c