Forum Delphi.cz

Delphi => Obecné => Téma založeno: < z > 04-10-2012, 14:53:42

Název: Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: < z > 04-10-2012, 14:53:42
TLama me dost nahlodal ohledne toho sleep ve vlakne,
tak jsem to zkousel

puvodne jsem pouzival tuto proceduru, abych neblokl vlakno na hodne dlouho,
kdyz by bylo potreba ukoncit

Kód: Delphi [Vybrat]
  1. function TMyThread.Wait(const time: integer):Boolean;
  2. var
  3.   i:integer;
  4. begin
  5.   for i:=1 to time do
  6.     begin
  7.       if Terminated then
  8.         Exit(False);
  9.  
  10.       Sleep(1000);
  11.     end;
  12.  
  13.   Result:=True;
  14. end;

Sleep zamenim za FTerminateEvent.WaitFor(1000);
kde FTerminateEvent: TEvent;
(pripadne za WaitForSingleObject(FEvent, 1000) = Wait_TimeOut)

Resp. muzu kompletne vyhodit, ze se to ma kazdou sekundu kontrolovat ...
No a za pomoci
FTerminateEvent.SetEvent;
to zrejme lze hodne rychle zrusit ...

jiste asi zalezi na tom, proc to vlakno ma spat,
no otazka je jednoducha :)

Jaky to bude mit fakticky prinos? Neco, ceho by se procesor mel bat? :)
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: Radek Červinka 04-10-2012, 15:08:21
Ještě se podívej na SleepEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms686307%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686307%28v=vs.85%29.aspx).
Dříve bylo doporučováno než použít Sleep, tak raději SleepEx - dá se probouzet.
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: Morrison 04-10-2012, 18:07:27
Já jsem před nějakým časem právě toto testoval a (přesné hodnoty si už nepamatuji) WaitFor...() bylo tak o jeden řád méně náročné na CPU než Sleep(), takže na tom opravdu něco bude  ;)
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: pf1957 04-10-2012, 18:11:13
Kód: Delphi [Vybrat]
  1. function TMyThread.Wait(const time: integer):Boolean;
  2.  
Spatne je hned to, ze ve thread vubec existuje nejaka metoda Wait :-) Pokud se nejedna o single shot thread, tak ma v prinicpu vypadat nejak takhle:
Kód: Delphi [Vybrat]
  1. procedure Txxxx.Execute;
  2. begin
  3.   try
  4.      _BeforeExecute;
  5.     try
  6.        while not Terminated do
  7.          begin
  8.              WxRes := WaitForMultipleObjects(.....);
  9.              case WxRes of
  10.                 WAIT_OBJECTS_0+ord(obj1): ....;
  11.                 WAIT_OBJECTS_0+ord(obj2): ....;
  12.                 WAIT_OBJECTS_0+ord(obj3): ....;
  13.                 ...
  14.                 WAIT_ABANDONED+ord(obj1): ...;
  15.                 WAIT_ABANDONED+ord(obj2): ...;
  16.                 WAIT_ABANDONED+ord(obj3): ...;
  17.                 ...
  18.                 WAIT_TIMEOUT: ...;
  19.                 else ...;
  20.               end;
  21.          end;
  22.     finally
  23.       _AfterExecute;
  24.     end
  25.   except on E:Exception do
  26.     begin
  27.        ...
  28.     end;
  29.   end
  30. end;
  31.  

tj. jinymi slovym: kdyz nema procesor co na praci, tak nema co konzumovat strojovy cas. Takze prakticky tim ziskas:
- minimalni overhead
- bude to vypadat, ze to nekdo naprogramoval a nenastrikal  ;)
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: < z > 05-10-2012, 08:24:51
tak jsou urcite situace, kdy je potreba nachvilu pockat nebo odpocitavat (10 ... 9 ... 8 ... :D) a kde neni potreba
soucinnost s jinou cinnosti ... nevim, jak bych tam tuto konstrukci upotrebil :)

me spis zajimalo, proc sleep ma takovy nasledky na procesor, kdyz to dela to stejny jak waitfor :D
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: Radek Červinka 05-10-2012, 08:50:46
me spis zajimalo, proc sleep ma takovy nasledky na procesor, kdyz to dela to stejny jak waitfor :D

No já jsem si myslel, že právě v těchto situacích máš použít SleepEx místo Sleep, kdysi jsem četl že právě z důvodu využití procesoru to bylo předáno - ale bylo to v době Windows 2000 a proto mne zajímalo zda to má nějaký význam stále.
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: pf1957 05-10-2012, 09:04:38
tak jsou urcite situace, kdy je potreba nachvilu pockat nebo odpocitavat (10 ... 9 ... 8 ... :D)
Ano, ale to se ve threadech dela tak, ze se nastartuje v OS timer a preda se mu jak parametr handle nektereho z Obji a kdyz timer tickne, tak si to oblouzis ve vetvi WAIT_OBJECTS_0+ord(Obji). Tam si muzes odcitat do aleluja
a kde neni potreba soucinnost s jinou cinnosti ... nevim, jak bych tam tuto konstrukci upotrebil :)
Vzdycky je treba soucinnost, minimalne s terminate request.
Je treba prestat vytvaret proceduralni spagetti kod a kooperativne se nedotazovat na ukonceni threadu jako se to delavalo za dob CP/M nebo Win 3.x, ale resit to jako sekvencni automat, ktery krome akci a prechodu ze stavu do stavu nekonzumuje zadny cas. A ziskas tim obecne rozsiritelnou strukturu, do ktere pridas pouze nove eventy, aniz bys v pripade nejake evoluce programu musel vsechno obracet naruby. A samozrejme to vola po nejakem abstraktnim predku, kdyz se pohybujeme ve svete OOD/OOP...

sleep ma takovy nasledky na procesor, kdyz to dela to stejny jak waitfor
Samotne sleep bude srovnatelne s WaitForXXX, ale vsechno zhorsuje, kdyz cekas v nejakem cyklu, protoze OS musi naprosto zbytecne vzbudit tvuj proces, nechat ho udelat pruchod cyklem a zase uspat. Kdezto kdyz budes cekat treba na 2 udalosti, jednu Terminate, druhou ke spusteni nejake akce, tak celou dobu bude tvuj thread suspendovan a vse se bude odehravat jen na urovni rezie OS.

Delici rovinu mezi technikami vidim v tom, zda programujes komponentove nebo objektove - v mych ocich zda jsi strikac nebo programator  ;)
Název: Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
Přispěvatel: < z > 05-10-2012, 16:17:21
clovek se snazi nebyt strikac, jsou ale urcite urovne, ke kterym se programator dostava po case :-p

takze, pokud to chapu dobre ... pocitacka v systemu ma seznam, podle ktereho budi eventy, ktery tam nacpu,
tim usetrim procesorovy cas, ze se nemusi vytvaret dalsi vlastni pocitacka :)

uz mi to asi zacina byt jasnejsi

na SleepEx jsem koukal, videl jsem to poprvy libi se mi to min nez WaitFor :)