Entwickler-Ecke
Sonstiges (Delphi) - Problem mit Prozesse loggen
Hansi@OMG - Do 08.05.03 16:28
Titel: Problem mit Prozesse loggen
Also, ich hab den Code zum Prozesse anzeigen. Die Anzahl der Prozesse die beim Start meines Programms offen sind werden in einer Variable "start" abgelegt. Es erneuert jede Sekunde die Liste der Prozesse. Wenn die Anzahl der Prozesse, die gerade in der Listbox angezeigt werden größer ist, als die Anzahl der Prozesse, die beim Start des Programms offen waren, soll er alle neuen Prozesse durchgehen in einer Wiederholungsschleife und diese in listbox2 reinschreiben, mit der aktuellen Uhrzeit und dem kürzel "(open)". Dies soll er jedoch nur 1mal reinschreiben und zwar dann, wenn der Prozess das erste mal auftaucht und er soll, wenn der Prozess wieder geschlossen wird, den Namen des Prozesses mit der aktuellen Uhrzeit und dem Kürzel "(close)" dazuschreiben.
1. Ich habe das Problem, dass jedes mal, wenn er den Timer durchläuft, in dem das oben genannte steht, den Prozess reinschreibt und nicht nur, wenn dieser gestartet wird.
2. Ich schaffe es nicht, dass er wirklick nach dem spezifischen Prozessnamen sucht, der wieder beendet wird.
Bitte um schnelle Hilfe, ist sehr wichtig!
ase - Do 08.05.03 22:33
das wichtigste ist: ruhe bewahren 8)
ich schreib jetzt nich den gesamten quellcode weil des zu ausführlich währe und dir nicht wirklich hilft, darum nen paar tips.
- definiere dir ein objekt. meinet wegen TProcess.
- dieses objekt muss alle eigenschaften besitzen, die ein prozess in deinem programm haben kann. also beispielsweise: Ist der prozess schon vor dem start des programms da gewesen? ist der prozess noch aktiv (open) oder schon wieder beendet worden (close)? name des prozesses und sonstiges nützliches
- benutze ListBox1.Items.AddObject(Prozess.Name, Prozess), um deine einträge mit den entsprechenden objekten zu assoziieren.
- wenn dein timer ereigniss feststellt, dass ein prozess geschlossen wurde, einfach in liste suchen und ListBox.Items.Objects[x].Close := True oder sowas.
wenn du das so machst, dann sollte nichts mehr schief gehen.
viel glück!
ase
Hansi@OMG - Fr 09.05.03 15:55
Was heißt ein Objekt definieren? Wie geht das?
ase - Fr 09.05.03 16:14
hoho... ich tu dir mal den anfang einfach vorgeben:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Type TProcessMode = (pmBeforeStart, pmRunning, pmClosed);
TProcess = Class(TObject) Private FTaskName: String; FMode: TProcessMode; Public Constructor Create(AName: String; AMode: TProcessMode);
Property Name: String read FTaskName; Property Mode: TProcessMode read FMode write FMode; End;
// Unter IMPLEMENTATION
Constructor TProcess.Create(AName: String; AMode: TProcessMode); Begin Inherited Create; FTaskName := AName; FMode := AMode; End; |
so, nun hast du nen eigenes objekt definiert. dieses objekt "hält" für dich den taskname und den modus des tasks.
pmBeforeStart haben alle die prozesse, die für deine anwendung aktiv waren.
pmRunning haben alle die, die nach deiner anwundung gestartet wurden. also die die (open) davor zu stehen haben.
pmClosed sind die, die vorher
pmRunning waren, dann aber geschlossen wurden.
mittels constructor kannst du dann die initial-eigenschaften festlegen. also beim start dann:
(pseudo)
Quelltext
1: 2: 3:
| ... For i := 1 to Anzahl der laufenden prozesse do ListBox1.Items.AddObject(Prozessname, TProcess.Create(Prozessname, pmBeforeStart)); |
somit assoziierst du mit jedem eintrag in deiner listbox ein TProcess objekt. ran kommen tust du dann so:
Quelltext
1:
| Label1.Caption := TProcess(ListBox1.Items.Objects[ListBox1.ItemIndex]).Name; |
jetzt musst du jede sekunde (?) die prozessliste abfragen. dann checkst du anhand der liste1 ob neue hinzugekommen sind. wenn ja, dann:
Quelltext
1:
| ListBox_2_.Items.AddObject(NeuerProzessName, TProcess.Create(NeuerProzessName, pmRunning)); |
pmRunning weil der ja neu dazugekommen ist.
im selben atemzum checkst du, ob vielleicht ein prozess, der vorher in deiner liste2
pmRunning hatte schon beendet wurde. also dessen name dir von windows nicht zurückgegeben wurde. wenn du da einen hast, dann folgendes:
(halb-pseudo)
Quelltext
1: 2: 3: 4: 5:
| x = ItemIndex der Liste2 des beendeten prozesses (IndexOf- methode)
liste_3_.Items.AddObject(Prozessname, ListBox_2_.Items.Objects[x]); TProcess(liste_2_.Items.Objects[x]).Mode := pmClosed; liste_2_.Items.Delete(x); |
so sollte des gehen. ob du dann noch (open) oder (close) davor schreibst bleibt dir überlassen.
vielleicht konnte ich dir ja helfen!
ase
Hansi@OMG - Fr 09.05.03 16:38
Danke, ich versteh des jetzt zwar überhaupt nicht mehr, aber der matze wird mir des bestimmt erklären, der geht nämlich bei mir auf die Schule.
ase - Fr 09.05.03 16:45
:( ich dachte ich hätte des gut erklärt.
ich kanns auch ausführlicher machen aber dazu fehlt mir gerade die zeit weil mein soeben fertig gewordener Download von Debian ruft. wenns garnet geht, dann einfach nochmal fragen!
ase
Hansi@OMG - Fr 09.05.03 20:50
Du hast es auch gut erklärt, bloß meine Delphikenntnisse sind in dieser Richtung noch unterentwickelt, deshalb versteh ich des nicht so ganz. Aber danke für die ausführliche Erklärung. :D
ase - Fr 09.05.03 21:22
tja dann hast du jetzt die einmalige gelegenheit deine delphikenntnisse zu erweiter. objekte sind nen großer themenkomplex musst du wissen. viel spaß dabei!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!