Аналог sleep в дельфи

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 2pick, 20 Sep 2009.

  1. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    38
    Reputations:
    2
    Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке?

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

    З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
     
    #1 2pick, 20 Sep 2009
    Last edited: 20 Sep 2009
  2. Dosia

    Dosia Member

    Joined:
    5 Jun 2009
    Messages:
    118
    Likes Received:
    81
    Reputations:
    6
    WaitForSingleObject(GetCurrentThread(), 5000);
     
    2 people like this.
  3. 2pick

    2pick Elder - Старейшина

    Joined:
    17 Mar 2007
    Messages:
    117
    Likes Received:
    38
    Reputations:
    2
    Спасибо, только еще хуже стало :)
    на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает.

    Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete
    А вот рабочий стол со всем содержимым впадает в ступор.
    Форма отрисовывется, а вот скрытие ее не срабатывает.
     
    #3 2pick, 20 Sep 2009
    Last edited: 20 Sep 2009
  4. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Не знаю, может поможет:

    Code:
    >> Процедура 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, протупил, значит не поможет :(
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ппц вы гении. Автор, у тебя чтото с кодом наверное, а не с функций Sleep. Потому что она останавливает выполнение потока из которого она выполнена.

    Вырезка из MSDN
    Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread
     
    #5 slesh, 20 Sep 2009
    Last edited: 20 Sep 2009
    3 people like this.
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    не морочь голову с TThread и тд а создавай новый поток через апи CreateThread. используй в процедуре обработки апи Sleep() и все будет впорядке.

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

    Code:
    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>
     
    #6 sn0w, 21 Sep 2009
    Last edited: 21 Sep 2009
    1 person likes this.
  7. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    В чем-то другом проблема. Sleep() в созданном потоке не влияет на работу основного.
    Только почему ты пишешь "делаю слип 5 секунд", а в коде Sleep(500) - полсекунды?

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

    jaypi New Member

    Joined:
    19 Aug 2009
    Messages:
    38
    Likes Received:
    1
    Reputations:
    0
    а если
    Code:
       Sleep(500);
       Application.ProcessMessages;
    
     
  9. Пуховой

    Joined:
    25 Nov 2007
    Messages:
    46
    Likes Received:
    37
    Reputations:
    0
    jaypi, ага, или for i:=1 to 1000 do sleep (5); :)

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