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!