Sleep (delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by STLcRash, 21 May 2012.

  1. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    В программе кучу раз использую Sleep+application.processmessages;

    либо
    Code:
    //p - пауза в секукндах
      procedure pause(p:byte); 
    var pa1:ttime; 
    begin 
    pa1:=encodetime(0,0,p,0)+time; 
    repeat 
    application.processmessages; 
    sleep(10); 
    until time>=pa1; end;
    
    Но и то и то "убивает" визуальные эффекты программы.
    Тоесть скин начинает работать неправильно, кнопки при наведении мышки не подсвечиваются и тд...

    Как решить проблему?

    Возможно ли вызывать паузу в отдельном потоке и ждать, пока поток завершится?
    Если можно, то как это реализовать? Загуглить не вышло :(
     
  2. kzooz

    kzooz New Member

    Joined:
    20 May 2012
    Messages:
    18
    Likes Received:
    1
    Reputations:
    5
    Code:
    procedure pause(col:integer); 
    var wtim:ttime;
    begin
    wtim:=encodetime(0,0,col,0)+time;
    repeat
    application.processmessages;
    sleep(10);
    until time>=wtim;
    end;
    
     
  3. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Я же написал, что такая пауза "убивает" все визуальные эффекты. Форма не зависает, но эффекты пропадают.
     
  4. kzooz

    kzooz New Member

    Joined:
    20 May 2012
    Messages:
    18
    Likes Received:
    1
    Reputations:
    5
    Прошу прощения. С внимательностью у меня сегодня худо.
     
  5. Zoomer

    Zoomer New Member

    Joined:
    16 Jun 2011
    Messages:
    0
    Likes Received:
    3
    Reputations:
    0
    http://avtuh.ru/2010/04/09/delphi-dopolnitelnyj-potok-v-programme.html
     
  6. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    Procedure Wait(interval: integer);
    var
    time : integer;
    begin
    time = GetTickCount + interval;
    while GetTickCount < time do
    application.processmessages;
    end;

    как то так, не юзай Sleep , из-за него и идет "зависание" интерфейса, ну или отдельный поток тебе в помощь :)
     
  7. NOPNOP

    NOPNOP New Member

    Joined:
    13 Feb 2012
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    дак пускай функционал в отдельном потоке, тогда паузы не будут влиять на гуи
     
  8. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Выдает предупреждение
    Code:
    [Предупреждение] Unit1.pas(810): Combining signed and unsigned types - widened both operands
    Эффекты алфаконтроловских шкурок при таких паузах тоже пропадают.
     
    #8 STLcRash, 21 May 2012
    Last edited: 21 May 2012
  9. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Вопрос:
    Как быстро переделать прогу, чтоб в потоках всё выполняла?
    Там кода 5к строк....
     
  10. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    этот код работает хорошо
    по идее это должно работать и в дельфи

    Code:
    VOID GuiWait(int Milliseconds)
    {
    	HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    
    	LARGE_INTEGER DueTime;
    	
    	DueTime.QuadPart = -10000 * Milliseconds;
    
    	SetWaitableTimer(hTimer, &DueTime, 0, NULL, NULL, FALSE);
    
    	for (;;)
    	{
    		DWORD Status = MsgWaitForMultipleObjectsEx(1, &hTimer, 
    			INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE);
    		
    		if (WAIT_OBJECT_0 != Status)
    		{
    			MSG Msg;
    
    			while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))
    			{
    				TranslateMessage(&Msg);
    				DispatchMessage(&Msg);
    			}
    		}
    		else
    		{
    			break;
    		}
    	}
    
    	CloseHandle(hTimer);
    }
    
    
    если изменить для delphi то как то так будет

    Code:
    VOID GuiWait(int Milliseconds)
    {
    	HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    
    	LARGE_INTEGER DueTime;
    	
    	DueTime.QuadPart = -10000 * Milliseconds;
    
    	SetWaitableTimer(hTimer, &DueTime, 0, NULL, NULL, FALSE);
    
    	for (;;)
    	{
    		DWORD Status = MsgWaitForMultipleObjectsEx(1, &hTimer, 
    			INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE);
    		
    		if (WAIT_OBJECT_0 != Status)
    		{
    			Application.ProcessMessages;
    		}
    		else
    		{
    			break;
    		}
    	}
    
    	CloseHandle(hTimer);
    }
    
    
     
    #10 greki_hoy, 21 May 2012
    Last edited: 21 May 2012
  11. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    Прошу прощения :D , давно в делфи не писал, не
    time = GetTickCount + interval; , а
    time := GetTickCount + interval;
     
  12. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Как написать процедуру PAUSE(n:integer;) , чтоб создавала поток, в котором будет выполняться Wait(n) и процедура pause не завершалась, пока не завершится поток?
     
  13. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    юзай CreateThread и WaitForSingleObject :)
     
  14. STLcRash

    STLcRash New Member

    Joined:
    4 Jun 2009
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Как после запуска потока дождаться его завершения то? о-О
     
  15. -=Cerberus=-

    -=Cerberus=- κρυπτός γράφω

    Joined:
    29 Apr 2012
    Messages:
    1,321
    Likes Received:
    930
    Reputations:
    391
    Берете книгу по WinForms и учите мат.часть: потоки, делегаты, асих.вызовы, события и будет вам счастье
     
  16. zombiee

    zombiee New Member

    Joined:
    20 Dec 2006
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    WaitForSingleObject