![]() |
Listen vergleichen
Sorry habe irgendwie wieder was an der Waffel.
Ich erstelle eine Liste von Prozessen und eine Liste von ProzessId's Die Prozessliste hat 55 Einträge die ich mit meine ProzessId's Liste vergleichen muss (diese hat 4 Einträge). Habe wieder irgendwo einen Denkfehler wie vergleiche ich die liste nun mit unterschiedlichen Counter? Ok ;) Schlagt mich ruhig.. LOL
Delphi-Quellcode:
Überschreitet das Maximum logisch vProzessID hat ja nur 4 Einträge.
// prüfen ob aktiver prozess existiert
for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin if proc.ID = vProzessID[K].ID then bFound := true; end; end; gruss |
AW: Listen vergleichen
Du musst mit zwei geschachtelten Schleifen arbeiten.
Oder nimmst gleich ein TDictionary. EDIT: Oder schreibst einfach:
Delphi-Quellcode:
Nehme an, das es sich um TStringList handelt?
// prüfen ob aktiver prozess existiert
bFound := false; for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin bFound := true; end; end; |
AW: Listen vergleichen
Zitat:
Wie sind Deine Listen definiert? |
AW: Listen vergleichen
Zitat:
Delphi-Quellcode:
procedure CheckProzessID;
var IntI, K, M: Integer; vProcList: TProcesses; proc: TProcess; bFound: BOOL; begin bFound := false; // ProcList initialisieren vProcList := TProcesses.Create; // Prozesse einlesen vProcList.ReadSystem; // prüfen ob aktiver prozess existiert for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin if proc.ID = vProcList[K].ID then bFound := true; end; end; if not bFound then begin // Timer deaktivieren KillTimer(HSprMaster, ID_MRENDER); // Alle Objekte die mit diesen verbunden sind löschen for M := 0 to Length(AudioVolumeArr) - 1 do begin gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + M); // TAudioVolume freigeben AudioVolumeArr[M].free; end; // Array löschen SetLength(AudioVolumeArr, 0); // Session erstellen MainClass.CreateSession; // Window aktualisieren gSprSession.GI_UpdateWindow(HSprSession, false); // Timer aktivieren SetTimer(HSprMaster, ID_MRENDER, 60, nil); end; // Prozessliste löschen vProcList.Clear; // Prozessliste freigeben FreeAndNil(vProcList); end;
Delphi-Quellcode:
Im Anhang die *.pas mit ihren Möglichkeiten (ist nicht von mir)
vProzessID: TProcesses;
gruss |
AW: Listen vergleichen
Zitat:
Und wenn dann ist er falsch. gruss |
AW: Listen vergleichen
So wie ich das sehe hat TiGü recht,
sein Code sollte reichen, könnte man sogar noch etwas beschleunigen wenn man nach dem Finden abbricht.
Delphi-Quellcode:
// prüfen ob aktiver prozess existiert
bFound := false; for K := 0 to (vProcList.Count - 1) do begin if vProzessID.Find(vProcList[K].ID, proc) then begin bFound := true; break; // Abbrechen da wir den Process haben end; end; |
AW: Listen vergleichen
vProzessID wird von wem mit was befüllt?
|
AW: Listen vergleichen
Zitat:
Wenn ich nur so prüfe ist bFound immer true und das Ergebnis wäre mein Task mit der ID die nicht mehr existiert wird nicht beendet. gruss |
AW: Listen vergleichen
Wenn es so ist steht der Process in vProcessID.
Dein Problem ist in diesem Fall ein anderes...... Wie wäre es mit Debuggen? |
AW: Listen vergleichen
Zitat:
Delphi-Quellcode:
vProzessID.Add(ProcId, MainClass.DeviceName);
Wenn mein Control entfernt wird und CreateSession wird erneut auf gerufen wird die Liste geleert. Addiere ich eine Session zur Laufzeit dan nwird die Liste nicht geleert aber die neue ID zur Liste addiert. Wenn ich nun die Prozessliste mit den vorhandenen ID's vergleiche und ein Prozess wurde beendet soll das entsprechende Control entfernt werden. Das mache ich auf einfachem Wege indem ich alle lösche und aktive neu erstelle. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz