Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Trvání události

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Trvání události

Autor: Neon

10:56:58 11.08.2010

Děkuji za komplexní odpověď.

Neon

Citovat příspěvek

 

Re: Trvání události

Autor: JiriValerian

23:40:20 10.08.2010

[color=#008000]Neon Napsal:
-------------------------------------------------------
> Ahoj,
>
> chtěl bych se zeptat - když signalizuji událost
> pomocí SetEvent() (vytořena jako AUTO reset, tj.
> man_reset = FALSE), jak dlouho je tento signál
> dostupný?
>
> Jde mi o následující:
>
> Thread 1 vytvoří thread 2.
>
> Thread 2 se může spustit a vygenerovat nějakou
> událost (říkejme jí EV).
>
> Jenže v tu chvíli ještě nemusí proběhnout
> WaitForSingleObject v threadu 1, a mně jde o to,
> jestli - když kód threadu 1 konečně zavolá
> WaitForSingleObject - ta EV bude ještě "dostupná"
> nebo ne.[/color]

Událost je platná pokud na handle vytvořené voláním např. [b]CreateEvent[/b] nebylo zavoláno [b]CloseHandle[/b] nebo pokud neskončil proces, který tu událost vytvořil.

[color=#008000]> Resp. jestli SetEvent v thr 2 způsobí, že se
> proběhnou všechny V TU CHVÍLI na tu událost
> čekající WaitForSingleObject[/color]

Ne všechny, ale pouze jedno vlákno z čekajících. Pokud na událost, která byla vytvořena jako [b]auto-resetovací[/b], současně čeká více vláken pak se po nastavení události do signalizovaného stavu dočká jedno z nich. Není však zaručeno které.

[color=#008000]> stavu), nebo - pokud žádný WaitForSingleObject v
> tu chvíli nebude existovat - ta EV se "nezruší",
> ale "počká", až se nějaký WaitForSingleObject
> (kterému by se "přihlásila") objeví.[/color]

Pokud nebylo zavoláno [b]CloseHandle[/b] nebo dokud neskončil proces, který událost vytvořil, pak je událost platná. Pokud je událost nastavena do tzv. [b]signalizovaného stavu[/b] a byla vytvořena jako [b]auto-resetovací[/b] pak zůstává v signalizovaném stavu dokud není jedno vlákno uvolněno z čekacího stavu na tuto událost a tehdy systém zároveň automaticky nastaví stav této události do nesignalizovaného stavu, ale handle té události bude i nadále platné.

Pokud na událost vytvořenou jako [b]auto-resetovací[/b] nečeká žádné vlákno pak po nastavení handle do signalizovaného stavu zůstává událost v signalizovaném stavu do té doby než se jedno vlákno dostane z čekacího stavu na tuto událost nebo dokud nebude handle události uzavřeno viz [b]CloseHandle[/b] nebo dokud neskončí proces, který tu událost vytvořil.

Obecně lze říci to, že pokud se má nastavením události do signalizovaného stavu oznamovat nějaká informace více vláknům, pak je vhodné takovou událost vytvořit jako [b]ručně-resetovací[/b] a v takovém případě událost není čekací funkcí v případě probuzení vlákna uváděna do nesignalizovaného stavu a tím se probudí i ostatní vlákna čekající na tuto událost.

Zatímco pokud se má nastavením události do signalizovaného stavu oznamovat informace jen jednomu vláknu je vhodné takovou událost vytvořit jako [b]auto-resetovací[/b] a v takovém případě pokud bude na onu událost čekat více vláken tak bude probuzeno jen jedno z nich, ale není zaručeno které.

Citovat příspěvek

 

Trvání události

Autor: Neon

16:03:14 10.08.2010

Ahoj,

chtěl bych se zeptat - když signalizuji událost pomocí SetEvent() (vytořena jako AUTO reset, tj. man_reset = FALSE), jak dlouho je tento signál dostupný?

Jde mi o následující:

Thread 1 vytvoří thread 2.

Thread 2 se může spustit a vygenerovat nějakou událost (říkejme jí EV).

Jenže v tu chvíli ještě nemusí proběhnout WaitForSingleObject v threadu 1, a mně jde o to, jestli - když kód threadu 1 konečně zavolá WaitForSingleObject - ta EV bude ještě "dostupná" nebo ne.

Resp. jestli SetEvent v thr 2 způsobí, že se proběhnou všechny V TU CHVÍLI na tu událost čekající WaitForSingleObject, a pokud ano, tak se událost "zruší" (= přejde do nesignalizovaného stavu), nebo - pokud žádný WaitForSingleObject v tu chvíli nebude existovat - ta EV se "nezruší", ale "počká", až se nějaký WaitForSingleObject (kterému by se "přihlásila") objeví.

Nebo jak zajistit, aby thr 1 "neprošvihnul" událost? Že bych ji tedy musel vytvořit s příznakem man_reset = TRUE?

Doufám, že jsem problém popsal srozumitelně.

Předem dík za vysvětlení.

Neon

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: