[C#] Detecteren of een proces gestopt is

Pagina: 1
Acties:

  • Robain
  • Registratie: September 2006
  • Laatst online: 10-02 14:08
Hallo,


First things first, ik heb de search gebruikt, alsook google. Google gaf mij enkel sites waar uitgelegd werd hoe men kan detecteren of een proces gestopt is met reageren. De GoT search gaf me ... niks :9

Even de situatie schetsen:
- Ik heb een programma (niet zelf geschreven) dat ik wil aanpassen naar mijn noden.
- Het programma hookt zich aan windows om de druk op een specifieke knop van een specifieke afstandsbediening te detecteren.
- Wanneer deze knop ingedrukt wordt zorgt dit programma ervoor dat er een bepaald proces wordt opgestart, in plaats van het standaardproces zoals het in de driver van deze afstandsbediening bepaald is.


Zo is het programma nu, ik wil het echter aanpassen op de volgende manier :
- Wanneer de gebruiker op de knop duwt wordt het proces opgestart
- Programma wordt unhooked, zodanig dat de normale functionaliteit van die knop herstelt wordt
- Programma wordt terug hooked wanneer het proces dat opgestart is door dit prog terug afgesloten wordt.


Hooken en unhooken blijkt enorm simpel te gaan dmv KeyboardHook.IsEnabled = false/true.

Mijn grote probleem zit hem echter in het detecteren wanneer het opgestarte proces afgesloten wordt. Mijn eerste (en enige :D) gedacht was iets als dit :
- Een timer die iedere seconde (sneller hoeft het niet) controleert of het process nog bestaat
- Indien het niet bestaat opnieuw hooken
- Indien het bestaat, do nothing...

Ik vrees echter een beetje dat dit zeeeer inefficient zal zijn...

Wat denken jullie?? Iemand die toevallig een betere, elegantere oplossing heeft??


MVG,
Robin

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

System.Diagnostics.Process.HasExited

ofte:

http://msdn.microsoft.com...ssclasshasexitedtopic.asp

ASSUME makes an ASS out of U and ME


  • Robain
  • Registratie: September 2006
  • Laatst online: 10-02 14:08
Maar dat zou echter nog steeds inhouden dat ik dat iedere seconde moet checken???

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 08-02 12:48
Een thread heeft ook een stopmethode? Of er worden iig wat zaken gedisposed... Op dat moment kun je natuurlijk een event firen dat het proces in z'n stopping state is...

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • LoekD
  • Registratie: Augustus 2000
  • Laatst online: 24-01 09:34

Hoe meer je drinkt, hoe korter je leeft, hoe minder je drinkt


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Een andere, wellicht minder elegante manier zou zijn om een losse thread (bij voorkeur uit de thread-pool) het dat proces te laten starten, en dan met WaitForExit() te wachten tot het proces is afgesloten. Dan kun je hopelijk vanuit die thread ook de hook weer aanzetten.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • Alex
  • Registratie: Juli 2001
  • Laatst online: 08-02 12:48
Korben schreef op woensdag 25 oktober 2006 @ 02:42:
Een andere, wellicht minder elegante manier zou zijn om een losse thread (bij voorkeur uit de thread-pool) het dat proces te laten starten, en dan met WaitForExit() te wachten tot het proces is afgesloten. Dan kun je hopelijk vanuit die thread ook de hook weer aanzetten.
Dan doe je onder water exact hetzelfde als ik zeg en LoekD aanvult. Een event afvangen.
Lijkt me beetje overkill van resources.

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


  • Robain
  • Registratie: September 2006
  • Laatst online: 10-02 14:08
@Alex : wat bedoel je precies met overkill van resources?? Dat dit te veel zal verbruiken?? Het is natuurlijk de bedoeling dat de footprint van dit programma zo klein mogelijk is...

Het beste lijkt mij de oplossing van LoekD. De thread gewoon laten slapen tot dat exited event opgegooid wordt...

In ieder geval thank voor de replies tot nu toe, heb er al weer heel wat uit bijgeleerd :)


Grtz,
Robin

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Simpel te doen met de Exited event.

C#:
1
2
3
// Creeer een eventhandle, instantie van proces dient aangemaakt te zijn
this.remoteControlProcess.Exited += new System.EventHandle(this.remoteControlProcess_Exited);
remoteControlProcess.EnableRaisingEvents = true;


C#:
1
2
3
4
5
// delegate methode door eventHandler opgeroepen
private void remoteControlProcess_Exited(object sender, System.EventArgs e)
{    
     MessageBox.Show("Proces is gestopt");
}

  • Robain
  • Registratie: September 2006
  • Laatst online: 10-02 14:08
Zo ziet de code om het proces te starten er momenteel uit:

C#:
1
2
3
4
5
6
7
8
                Process ehprocess = new Process();

                ehprocess.StartInfo.FileName = "ehshell";
                ehprocess.StartInfo.WorkingDirectory = Path.GetDirectoryName(uri.LocalPath);
                ehprocess.StartInfo.UseShellExecute = true;
                ehprocess.Exited += new System.EventHandle(this.ehprocess_Exited);
                ehprocess.EnableRaisingEvents = true;
                ehprocess.Start();



Dit geeft echter de volgende fout :
Error 1 The type or namespace name 'EventHandle' does not exist in the namespace 'System' (are you missing an assembly reference?)
Wegen mijn vrij beperkte C# kennis weet ik niet echt hoe dit op te lossen...

Heb op msdn gezocht naar EventHandle, en vind daar idd niets over, maar weet ook niet door wat ik het moet vervangen...


Any ideas??

De rest van de code is simpeler en is denk ik allemaal juist aangepast :)


Greetz, and thanks!!!

  • Robain
  • Registratie: September 2006
  • Laatst online: 10-02 14:08
Boy do I feel stupid :D


Heb een beetje in de Koders.org database naar samples gezocht i.v.m. Exited events opvangen, en blijkbaar gaat het gewoon om een typfoutje. EventHandler moet het dus zijn :)

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
Was een typo, had ik zo uit de losse pols getikt. Moet EventHandler zijn natuurlijk.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Alex schreef op woensdag 25 oktober 2006 @ 09:42:
[...]


Dan doe je onder water exact hetzelfde als ik zeg en LoekD aanvult. Een event afvangen.
Lijkt me beetje overkill van resources.
Ten eerste is het geen overkill van resources, omdat ik zei dat je het het beste met een thread uit thread-pool kunt doen.

Ten tweede, op de achtergrond gebeurt er niet echt hetzelfde. Ja, er wordt in allebei de gevallen gewacht op een WaitHandle die gesignaled wordt, maar dat gebeurt heel verschillend in beide manieren (kijk maar eens met ILDasm).

Ten derde, imo is een losse methode die alle logic bevat netter dan op 1 plek een stuk code wat het proces start en 2000 regels verderop ergens een keer een event handler die het Exited event afhandelt.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1