2011-08-29 9 views
11

Byłem bardzo zadowolony, że Delphi wprowadza rekord TMonitor w Delphi 2009, umożliwiając blokowanie określonych obiektów w środowisku wielowątkowym. Zastanawiałem się nad metodami Pulse i PulseAll tego typu rekordów.W Delphi, co robi System.TMonitor.Pulse i TMonitor.PulseAll faktycznie robię

Na przykład wpis dla Pulse w stanach pomocy Delphi "Powiadamia następnego wątku w kolejce oczekującej, że będzie mógł zablokować określony obiekt, gdy tylko wywołujący wątek zwolni obiekt."

Naprawdę? Co to znaczy? Użyłem TMonitor bez użycia Pulse bez problemów. Ponadto niektóre zastosowania TMonitor w źródle Delphi nigdy nie używają Pulse.

Czy metody Pulse i PulseAll są uwzględniane tylko w rekordzie TMonitor firmy Delphi w celu uzyskania zgodności na poziomie źródła z klasą monitora .NET lub czy rzeczywiście służą one celowi?

Istnieją dwa pytania ("TMonitor.Pulse vs TMonitor.PulseAll" i "What is TMonitor in Delphi System unit good for"), które mówią o tym numerze, ale szukam ostatecznej odpowiedzi.

Odpowiedz

4

Link wikipedia w mojej odpowiedzi na zadane pytanie stanowi omówienie użycia funkcji wait/pulse/pulseall monitora. Wątek musi wejść do monitora im zadzwoń czekać. Następnie kolejna nić musi wejść do monitora i wywołać impuls lub puls, aby zasygnalizować pierwszy wątek oczekiwania. Pulse sygnalizuje tylko jedną oczekującą nić, natomiast pulseall sygnalizuje wszystkie oczekujące wątki. Zajrzyj do sekcji zmiennej warunków artykułu wikipedia, aby uzyskać bardziej szczegółową dyskusję. Istnieją również komentarze w źródle RTL opisujące metody TMonitor.

+2

Czy TMonitor jest naprawiony w XE2? –

+0

@ David, przepraszam moją ignorancję, ale co było/jest z nią nie tak? – Johan

+0

@johan Wygląda na to, że Wait and Pulse nie działają poprawnie. Wiele blogów na ten temat kilka miesięcy temu od Chrisa Rollistona, Primoz, Eric Grange itp. –