Voorinformatie:
Ik heb hier een GUI applicatie die moet kunnen uitlezen welke taken er via een scheduled task draaien.
Die taken zijn console-apps. Het is moeilijk vast te stellen via de bestaande libraries van Windows en daarbij moet er ook nog IPC plaatsvinden.
Mijn idee was iets van; het eerste process is de aanmeld service waar iedereen zich op abonneert en die blijft leven zolang er nog andere processen zijn.
Met dit voorkom je een losse service die altijd moet draaien. TCP verkeer is niet mogelijk en het draait altijd op hetzelfde systeem, dus communicatie via named pipes geniet op dit moment mijn voorkeur.
Mijn vraag gaat dus over een proces wat blijft leven totdat alle andere relevante processen afgesloten zijn.
Mijn eerste idee was iets met semaphores te doen, maar heb eigenlijk een soort omgekeerde semaphore nodig.
Daar je met een semaphore makkelijk kan throttlen, wil ik juist locks krijgen totdat de queue leeg is.
Ik zoek eigenlijk zoiets als het CountDownEvent, maar dan 'named' omdat het multiprocess is.
Ik heb bij wijze van test effe iets in elkaar gehacked om het mechanisme te testen en dat werkt redelijk, maar voelt toch heel vies aan en ben benieuwd of er betere alternatieven zijn voordat ik dit uit ga werken.
Dit is een 'kladje' maar het werkt al een beetje.
Elk proces roept de Initialize aan en voordat ie aflsuit de WaitAndExit.
Het eerst gestartte proces zal blijven wachten totdat de anderen ook zijn afgesloten en alle overige sluiten direct.
Het stuk wat me het meeste dwarszit is de loop met de sleep erin. Dat is heel lelijk.
Verder zijn er nog natuurlijk andere issues te verzinnen zoals het crashen van een proces en die zijn handle niet teruggeeft, maar dat is allemaal wel op te lossen.
Ik heb hier een GUI applicatie die moet kunnen uitlezen welke taken er via een scheduled task draaien.
Die taken zijn console-apps. Het is moeilijk vast te stellen via de bestaande libraries van Windows en daarbij moet er ook nog IPC plaatsvinden.
Mijn idee was iets van; het eerste process is de aanmeld service waar iedereen zich op abonneert en die blijft leven zolang er nog andere processen zijn.
Met dit voorkom je een losse service die altijd moet draaien. TCP verkeer is niet mogelijk en het draait altijd op hetzelfde systeem, dus communicatie via named pipes geniet op dit moment mijn voorkeur.
Mijn vraag gaat dus over een proces wat blijft leven totdat alle andere relevante processen afgesloten zijn.
Mijn eerste idee was iets met semaphores te doen, maar heb eigenlijk een soort omgekeerde semaphore nodig.
Daar je met een semaphore makkelijk kan throttlen, wil ik juist locks krijgen totdat de queue leeg is.
Ik zoek eigenlijk zoiets als het CountDownEvent, maar dan 'named' omdat het multiprocess is.
Ik heb bij wijze van test effe iets in elkaar gehacked om het mechanisme te testen en dat werkt redelijk, maar voelt toch heel vies aan en ben benieuwd of er betere alternatieven zijn voordat ik dit uit ga werken.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| public static class ForkJoinSemaphore { static Semaphore _semaphore; static bool _owner; public static void Initialize() { _semaphore = new Semaphore(0, 999999999, "SOMEUNIQUESTRING", out _owner); if (!_owner) { //increase by 1 _semaphore.Release(); } } public static void WaitAndExit() { //owners should loop until the count == 0 if (_owner) { //loop until the counter hits 0 ,but don't wait the lock while (_semaphore.WaitOne(0)) { //increase again as our 'check' has decreased the counter _semaphore.Release(); Thread.Sleep(100); } _semaphore.Release(999999999); } else { //this will never wait unless the owner has been killed/died abruptly //decrease the counter by 1 _semaphore.WaitOne(); } } } |
Dit is een 'kladje' maar het werkt al een beetje.
Elk proces roept de Initialize aan en voordat ie aflsuit de WaitAndExit.
Het eerst gestartte proces zal blijven wachten totdat de anderen ook zijn afgesloten en alle overige sluiten direct.
Het stuk wat me het meeste dwarszit is de loop met de sleep erin. Dat is heel lelijk.
Verder zijn er nog natuurlijk andere issues te verzinnen zoals het crashen van een proces en die zijn handle niet teruggeeft, maar dat is allemaal wel op te lossen.
Lekker op de bank