Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Аналог sleep в дельфи (https://forum.antichat.xyz/showthread.php?t=142448)

2pick 20.09.2009 00:09

Аналог sleep в дельфи
 
Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке?

Код:

procedure Thread.Execute;
begin
while true do
begin
Synchronize(DoWork);
sleep(500);
end;
end;


З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит

Dosia 20.09.2009 00:29

WaitForSingleObject(GetCurrentThread(), 5000);

2pick 20.09.2009 01:27

Спасибо, только еще хуже стало :)
на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает.

Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete
А вот рабочий стол со всем содержимым впадает в ступор.
Форма отрисовывется, а вот скрытие ее не срабатывает.

Sams 20.09.2009 10:31

Не знаю, может поможет:

Код:

>> Процедура Delay (как в паскале)

Зависимости: Forms,Windows,SysUtils
Автор:      demon-777, demon-777@yandex.ru, Питер
Copyright:  Выдрана из RxLib
Дата:        23 мая 2002 г.
***************************************************** }

{Delay, не загружающий процессор}

procedure Delay(Value: Cardinal);
var
  F, N: Cardinal;
begin
  N := 0;
  while N <= (Value div 10) do
  begin
    SleepEx(1, True);
    Application.ProcessMessages;
    Inc(N);
  end;
  F := GetTickCount;
  repeat
    Application.ProcessMessages;
    N := GetTickCount;
  until (N - F >= (Value mod 10)) or (N < F);
end;
Пример использования:
Delay(1000); //Задержка на одну секунду

Цитата:

прога не оконная
Ой, sorry, протупил, значит не поможет :(

slesh 20.09.2009 10:50

ппц вы гении. Автор, у тебя чтото с кодом наверное, а не с функций Sleep. Потому что она останавливает выполнение потока из которого она выполнена.

Вырезка из MSDN
Цитата:

The Sleep function suspends the execution of the current thread for a specified interval.
Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread

sn0w 21.09.2009 12:54

не морочь голову с TThread и тд а создавай новый поток через апи CreateThread. используй в процедуре обработки апи Sleep() и все будет впорядке.

вот пример, правда на си

Код:

DWORD WINAPI TypingThread(LPVOID arg)
{
        for(int i=0; i<5; i++){
                printf("Xaxaxa\r\n");
                Sleep(2000);
        }

        printf("thread end\r\n");
        return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
        HANDLE  hthread;
        DWORD        tid;
               
        hthread = CreateThread(0,0,TypingThread,NULL,0,&tid);
       
        for(int i=0; i<15; i++){
                printf("tmain()\r\n");
                Sleep(1000);
        }

        printf("program end\r\n");
        return 0;
}

вывод:

c:\123123\Debug>123123
tmain()
Xaxaxa
tmain()
Xaxaxa
tmain()
tmain()
Xaxaxa
tmain()
tmain()
tmain()
Xaxaxa
tmain()
Xaxaxa
tmain()
tmain()
thread end
tmain()
tmain()
tmain()
tmain()
tmain()
program end

c:\123123\Debug>

M_script_ 24.09.2009 19:28

В чем-то другом проблема. Sleep() в созданном потоке не влияет на работу основного.
Только почему ты пишешь "делаю слип 5 секунд", а в коде Sleep(500) - полсекунды?

Цитата:

Сообщение от 2pick
З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит

Это ты неправильно понял, VCL можно использовать в консольных прогах.

jaypi 25.09.2009 13:03

а если
Код:

  Sleep(500);
  Application.ProcessMessages;


Пуховой 26.09.2009 09:37

jaypi, ага, или for i:=1 to 1000 do sleep (5); :)

2pick, как ни крути, не будет неосновной поток вешать систему. В том вся и прелесть.


Время: 20:01