Hvordan opsiges en anden applikation ved hjælp af c ++/c #/vc ++ yndefuldt?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der kører en uendelig sløjfe og udfører nogle vigtige funktioner i den sløjfe. Jeg skal give brugeren en anden applikation, der ville opsige applikationen med uendelig sløjfe. Problemet er hvad, hvis brugeren afslutter applikationen, når den er indenfor sløjfe, der udfører en operation. Det ville føre til inkonsekvent tilstand. Jeg forsøgte at dræbe () og TerminateProcess men de hjalp ikke. Er der nogen måde jeg kunne signalere applikationen med uendelig sløjfe, der fuldender din iteration og exit? Jeg er åben for solutuons i c #, cpp og vc ++.


EDIT ::


Kildekode for looping-programmet er tilgængeligt.

Bedste reference


Selv om der er mange variationer i Interprocess Communication, er det til dette formål en simpel begivenhed tilstrækkelig.


I processen skal du kontrollere:



  • hEvent = CreateEvent() (med et navn, gør det tilstrækkeligt unikt)

  • Kontroller det med jævne mellemrum med WaitForSingleObject(hEvent, ZERO\_TIMEOUT)



Fra processen til at kontrollere:



  • hEvent = OpenEvent() med samme navn

  • SetEvent(hEvent) vil medføre, at returneringsværdien fra WaitForSingleObject i den anden proces ændres.



En lidt pænere måde kan være at starte en baggrundstråd i hovedapplikationen, hvilket skaber et vindue og et proceslinjeikon med en exit-indstilling på menuen. Derefter behøver du kun at dele en begivenhed mellem tråde, ikke mellem processer, hvilket fjerner kravet om et unikt navn.

Andre referencer 1



  en applikation, der kører en uendelig sløjfe og udfører nogle vigtige funktioner



Så længe det gør 'vigtige funktioner', har det pågældende program en mulighed for at få nye indtastningsdata fra et sted (fx fra en fil eller fra en netværksstik). Derfor kan du tilføje et specielt token i input data med en betydning 'slutningen af ​​operationen'. Efter at have modtaget sådan formodning, vil programmet vide, at det er på tide at lukke sig ned. En af de enkleste tokens af denne art er end-of-file for almindelige filer eller fjernelse af sidestik.


Metoden, jeg netop har beskrevet, er enkel og er hvad der kan kaldes 'in-band control channel'. Det vil sige, at du bruger en enkelt kanal til både at foder data til at behandle og kommandoer for at kontrollere (selvom der kun er en kommando, 'stop').


Et alternativ til det ville være 'out of band control channel', det vil sige en anden kanal til at sende kommandoer mellem applikationer.



  Problemet er hvad, hvis brugeren afslutter applikationen, når den er indenfor sløjfe, der udfører en operation. Det ville føre til inkonsekvent tilstand.



Dine forsøg på at bruge kill er en mulighed for at bruge faciliteter, der er kendt som interprocess-signaler. For at kunne bruge det korrekt skal modtagelsesprogrammet registrere en signalhåndteringsrutine for at starte en shutdown på egen hånd. Afsenderen skal bruge et matchende signalnummer. Brug af kill (SIGKILL i POSIX) er ikke det bedste valg, fordi det har en særlig adfærd og ikke kan tildeles med en brugerdefineret signalhåndterer. I POSIX er det bedre at bruge SIGUSR1 eller en af ​​mange andre signaler. Jeg kan ikke huske native Windows ækvivalenter til det. [8]


Der er en række mekanismer til at organisere en interprocessorkommunikation mellem processer i et konventionelt operativsystem. Se Wikipedia til en komplet liste for alt fra en delt fil til navngivne rør og netværksstik. Vælg en der passer bedst til dine behov. Du behøver bare at videregive en enkelt smule data, så det er den bedste, der er den mest nemme at programmere. Det er den bedste. [9]