PDA

Просмотр полной версии : Задержка в потоке



fml1
07.02.2005, 23:51
Подскажите, многоуважаемый Олл как в потоке (THread) сделать задержку 60000 милисекунд, чтобы форма, из которой поток запускается реагировала на кнопки - работала вобчем. А то sleep(x) делает ее (форму) равнодушной к любому действию пользователя.
Может кто подскажет, как с помощью PeekMessage(...) организовать обработку событий во время вышеописанной задержки.

UUU
08.02.2005, 10:09
Странно, у меня в форме постоянно крутится цикл, в котором есть Application.ProcessMessages, также в цикле вызываются до 20 потоков, которые обращаются к веб-серверу (Инди-компонент) - никаких проблем с зависанием формы - нет.

fml1
08.02.2005, 18:56
UUU

проблем с зависанием формы - нет.
у меня задержку нужно сделать внутри потока (паузу), чтобы главная форма при этом реагировала. Из потока, не вызовешь Application.ProccessMessage :( А вот API функции можно вызвать, вот я и спрашиваю как их вызвать.

function waitWithMessageLoop(hEvent: THandle; dwTimeout: DWORD): boolean;
var
dwRet: DWORD;
msg: tagMSG;
lExit: boolean;
begin
if hEvent = 0 then
hEvent:= CreateEvent(nil, FALSE, FALSE, nil);

lExit:= true;
while(lExit) do begin
dwRet:= MsgWaitForMultipleObjects(1, hEvent, FALSE, dwTimeout, QS_ALLINPUT);
if (dwRet = WAIT_OBJECT_0) then begin
Result:= TRUE;
lExit:= false;
break;
end;
if (dwRet <> WAIT_OBJECT_0 + 1) then begin
Result:= false;
lExit:= false;
break;
end;

while( PeekMessage(msg, 0,0,0,PM_REMOVE)) do begin
TranslateMessage(msg);
DispatchMessage(msg);
if (WaitForSingleObject(hEvent, 0) = WAIT_OBJECT_0) then begin
Result:= TRUE;
lExit:= false;
break;
end;
if Form1.isExit then
lExit:= false;
break;
end;
end;
Result:= FALSE;
end;


Пробовал вышеуказанную функцию использовать:
waitWithMessageLoop(0, 60000);
Но внутри этой функции программа зацикливается.[/b]

Eugie
08.02.2005, 23:56
fml1, просто вызывай Sleep вне Synchronize - все должно работать