Задержка в потоке

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

07 фев 2005, 23:51

Подскажите, многоуважаемый Олл как в потоке (THread) сделать задержку 60000 милисекунд, чтобы форма, из которой поток запускается реагировала на кнопки - работала вобчем. А то sleep(x) делает ее (форму) равнодушной к любому действию пользователя.
Может кто подскажет, как с помощью PeekMessage(...) организовать обработку событий во время вышеописанной задержки.
UUU
Сообщения: 309
Зарегистрирован: 17 фев 2004, 09:27
Откуда: Иваново
Контактная информация:

08 фев 2005, 10:09

Странно, у меня в форме постоянно крутится цикл, в котором есть Application.ProcessMessages, также в цикле вызываются до 20 потоков, которые обращаются к веб-серверу (Инди-компонент) - никаких проблем с зависанием формы - нет.
fml1
Сообщения: 16
Зарегистрирован: 30 дек 2004, 15:15
Откуда: Росиия, Урал
Контактная информация:

08 фев 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
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

08 фев 2005, 23:56

fml1, просто вызывай Sleep вне Synchronize - все должно работать
Ответить