Autor Téma: Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne  (Přečteno 5475 krát)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1209
  • Karma: 44
    • Verze Delphi: 7, 2010
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? :)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #1 kdy: 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.
Dříve bylo doporučováno než použít Sleep, tak raději SleepEx - dá se probouzet.
Embarcadero MVP - Czech republic

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 417
  • Karma: 12
    • Verze Delphi: D5, XE2, 10.4.2, D11
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #2 kdy: 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  ;)
nil

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #3 kdy: 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  ;)
« Poslední změna: 04-10-2012, 22:17:32 od pf1957 »

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1209
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #4 kdy: 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

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3559
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #5 kdy: 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.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #6 kdy: 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  ;)
« Poslední změna: 05-10-2012, 09:58:55 od pf1957 »

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1209
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Sleep vs. Event.WaitFor/WaitForSingleObject ve vlakne
« Odpověď #7 kdy: 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 :)