Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm nach x Minuten beenden (https://www.delphipraxis.net/113139-programm-nach-x-minuten-beenden.html)

Delphi08 3. Mai 2008 10:02


Programm nach x Minuten beenden
 
Hey!
Ich suche eine Möglichkeit mein Programm nach 15 Minuten zu beenden.
Weiß denn da einer weiter?
Ist es auch möglich ein Programm, dass ich mit meinem gestartet hab dann ebenfalls mit zu beenden?!

Danke!

PS: Blutiger Anfänger :lol:

mkinzler 3. Mai 2008 10:04

Re: Programm nach x Minuten beenden
 
Sollte mit einem Timer gehen.
Wenn du die PID des gestateten Programmes kennst

Delphi08 3. Mai 2008 10:53

Re: Programm nach x Minuten beenden
 
könntest du dies vielleicht genauer erklären :)

Hab jetzt mal in google gesucht, aber nicht passendes gefunden. :(

mkinzler 3. Mai 2008 10:59

Re: Programm nach x Minuten beenden
 
Welchen Teil meinst du?

Delphi08 3. Mai 2008 11:12

Re: Programm nach x Minuten beenden
 
Den Teil mit dem Timer.
Also ich muss einen erstellen, aber wie sieht dann die "Funktion" aus?
Also der Quellcode.

mkinzler 3. Mai 2008 11:16

Re: Programm nach x Minuten beenden
 
Du legst dir einen Timer auf die Form stellst die Zeit auf 15 Minuten ( 15*60*1000) und fügst in .OnTimer den Code zum Beenden ein.

marabu 3. Mai 2008 11:48

Re: Programm nach x Minuten beenden
 
Hi,

geht es um eine Uhrzeit (15 Minuten später) oder soll das Programm maximal 15 Minuten (crippleware) benutzbar sein?

Da in meinen Programmen fast immer ApplicationEvents bearbeitet werden, brauche ich keinen TTimer:

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
    ApplicationEvents: TApplicationEvents;
    procedure ApplicationEventsActivate(Sender: TObject);
    procedure ApplicationEventsDeactivate(Sender: TObject);
    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  private
    Timer: TDateTime;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

uses
  DateUtils;

procedure TDemoForm.ApplicationEventsActivate(Sender: TObject);
begin
  Timer := Now - Timer;
end;

procedure TDemoForm.ApplicationEventsDeactivate(Sender: TObject);
begin
  Timer := Now - Timer;
end;

procedure TDemoForm.ApplicationEventsIdle(Sender: TObject;
  var Done: Boolean);
begin
  Done := Application.Active and ((Now - Timer) >= (15 * OneMinute));
  if Done then
    Close;
end;
Freundliche Grüße

Delphi08 3. Mai 2008 12:20

Re: Programm nach x Minuten beenden
 
@mkinzler: Dank dir ;)

Ja das Programm soll einfach nur 15 min etwas anzeigen und danach soll es sich beenden.

jetzt muss ich nur noch wissen wie ich zb. Firefox mit beende, diesen hab ich aus meinem Programm raus mitgestartet.

DeddyH 3. Mai 2008 12:25

Re: Programm nach x Minuten beenden
 
Such mal nach Hier im Forum suchenExecAndWait.

Delphi08 3. Mai 2008 17:29

Re: Programm nach x Minuten beenden
 
Hab in diesem Thread hier folgendes gefunden:

Delphi-Quellcode:
procedure CloseProcessWindows(const AProcessID: DWord);
  function CloseWindowsCB(AHandle :HWND; AProcessID: DWord): LongBool; stdcall;
  var
    myProcessID: DWord;
  begin
    GetWindowThreadProcessId(AHandle, @myProcessID);
    // compare process id of AHandle against AProcessID
    if myProcessID=AProcessID then
      PostMessage(AHandle, WM_CLOSE, 0, 0);

    Result:= True;
  end;
begin
  EnumWindows(@CloseWindowsCB, AProcessID);
end;
weiß aber leider damit kaum was anzufangen... -> armer Anfänger :(

mkinzler 3. Mai 2008 17:32

Re: Programm nach x Minuten beenden
 
Die Prozedur schließt einen Prozess mit einer bestimmten PID.

Delphi08 3. Mai 2008 17:37

Re: Programm nach x Minuten beenden
 
ja, dass wusste ich (dachte ich zumindest^^).

Schließt die das Programm, wenn meins geschlossen wird? Oder wie funktioniert dass?
Wie übegeb ich ihm die PID von Firefox, also wo muss ich die reinschreiben?

Sorry für die ganzen dummen Fragen, aber ich hab es noch ned lang mit programmieren zu tun :roll:

Danke!

mkinzler 3. Mai 2008 17:43

Re: Programm nach x Minuten beenden
 
Delphi-Quellcode:
procedure CloseProcessWindows(const AProcessID: DWord); <-- AProcessID = PID

Delphi08 3. Mai 2008 17:57

Re: Programm nach x Minuten beenden
 
okay hab es nun mal getestet, es funktioniert, ist aber eine sehr unsaubere Art Firefox oder ähnliches zu schließen.
Gibt es da noch was "schöneres"?

mfg

Apollonius 3. Mai 2008 18:02

Re: Programm nach x Minuten beenden
 
TerminateProcess wäre unsauber. Wenn du die PID dynamisch ermittelst, ist mit der oben gezeigten Methode alles in Ordnung.

mkinzler 3. Mai 2008 18:04

Re: Programm nach x Minuten beenden
 
Nimm WM_CLOSE_QUERY statt WM_CLOSE

Apollonius 3. Mai 2008 18:06

Re: Programm nach x Minuten beenden
 
Diese Nachricht existiert nicht.

Apollonius 3. Mai 2008 18:15

Re: Programm nach x Minuten beenden
 
Die PN des Threaderstellers beantworte ich öffentlich, damit andere auch noch etwas davon haben.

Am besten sucht man ein Fenster mit bekanntem Titel oder bekanntem Klassennamen und erhält dann mit GetWindowThreadProcessId die gewünschte PID. Den Klassennamen eines Fensters erhält man zum Beispiel mit Hier im Forum suchenWinspy. Im Gegensatz zu Fensterhandle und PID ist er immer gleich.

Delphi08 3. Mai 2008 18:30

Re: Programm nach x Minuten beenden
 
Zitat:

Zitat von Apollonius
Die PN des Threaderstellers beantworte ich öffentlich, damit andere auch noch etwas davon haben.

Am besten sucht man ein Fenster mit bekanntem Titel oder bekanntem Klassennamen und erhält dann mit GetWindowThreadProcessId die gewünschte PID. Den Klassennamen eines Fensters erhält man zum Beispiel mit Hier im Forum suchenWinspy. Im Gegensatz zu Fensterhandle und PID ist er immer gleich.

jetzt verwirrst du mich total :roll:

Okay ich hab nun den "Klassennamen"? von Firefox "MozillaUIWindowClass" oder?
Aber was mache ich mit diesem?

DeddyH 3. Mai 2008 18:53

Re: Programm nach x Minuten beenden
 
Das Problem ist dabei aber, dass man nicht weiß, ob es sich bei der gefundenen Instanz wirklich um die von einem selbst gestartete handelt.

rollstuhlfahrer 4. Mai 2008 07:09

Re: Programm nach x Minuten beenden
 
mit MSDN-Library durchsuchenProcessFirst MSDN-Library durchsuchenProcessNext kann man ermitteln, welche Kindprozesse es gibt (Prozesse, die von deinem Programmm aus gestartet wurden. Dabei bekommt man aber dann kein Fensterhandle, sondern gleich eine PID.

Delphi-Quellcode:
uses TlHelp32;
type TProcessIds = array of DWORD;

function GetChildrenProcessesID(ParentProcessId: DWORD): TProcessIds;
var
hProcSnap: THandle;
pe32: TProcessEntry32;
begin
Result := nil;
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
if hProcSnap <> INVALID_HANDLE_VALUE then
begin
  pe32.dwSize := SizeOf(ProcessEntry32);
  if Process32First(hProcSnap, pe32) = true then
  begin
    while Process32Next(hProcSnap, pe32) = true do
    begin
      if pe32.th32ParentProcessID = ParentProcessId then
      begin
        SetLength(Result, Length(Result) + 1);
        Result[Length(Result) - 1] := pe32.th32ProcessID;
      end;
    end;
  end;
CloseHandle(hProcSnap);
end;
end;

// Aufruf
procedure TForm1.Button3Click(Sender: TObject);
var Children: TProcessIds;
    i: integer;
begin
  ListBox1.Clear;
  Children := GetChildrenProcessesID(GetCurrentProcessId); // Eigene Kinder finden
  for i := 0 to Length(Children) - 1 do
    ListBox1.Items.Add(IntToStr(Children[i]));
end;
rollstuhlfahrer

marabu 4. Mai 2008 08:24

Re: Programm nach x Minuten beenden
 
Wieso muss denn nach einem Prozess gesucht werden? Wenn die URL per ShellExecuteEx() geöffnet wurde, dann wird das process handle zurückgeliefert, genauso die Information, ob eine eigene Instanz des Browsers gestartet wurde oder nicht.

Delphi08 4. Mai 2008 18:33

Re: Programm nach x Minuten beenden
 
Zitat:

Zitat von marabu
Wieso muss denn nach einem Prozess gesucht werden? Wenn die URL per ShellExecuteEx() geöffnet wurde, dann wird das process handle zurückgeliefert, genauso die Information, ob eine eigene Instanz des Browsers gestartet wurde oder nicht.

wie würdest du es dann machen?!

mfg

mkinzler 4. Mai 2008 18:36

Re: Programm nach x Minuten beenden
 
Er meint, dass wenn du den PID schon kennst, ihn nicht über den Klassennamen ermitteln musst

DeddyH 4. Mai 2008 18:37

Re: Programm nach x Minuten beenden
 
Richtig, und dann könnte man den Code aus #10 verwenden.

Delphi08 4. Mai 2008 18:47

Re: Programm nach x Minuten beenden
 
okay ich hab wieder den Code aus #10

allerdings funktioniert nur WM_CLOSE allerdings nicht
Zitat:

WM_CLOSE_QUERY
(was ist eigentlich der Unterschied)?
Die PID ändert sich doch jedes mal, oder nicht?

hab testweise mal die Funktion so aufgerufen:
Delphi-Quellcode:
CloseProcessWindows(3992);
(funktioniert auch, aber da kann ich ja ned 3992 stehen lassen, oder?)

Larsi 4. Mai 2008 20:04

Re: Programm nach x Minuten beenden
 
Also hier nochmal die Komplettlösung:
Du ziehst eine Timer Komponente auf dein Formular, stellst den Interval im Objektinspektor auf die Millisekunden, nachdehnen es beendet werden soll ein, und in dann klickst du auf die Timer Komponente doppelt drauf und schreibst dort: Form3.Close; rein. Fals es bei dir nicht Form3 ist dann nehm einfach statt drei die Zahl deines Formulares ein. Das war jetzt eine Lösung wie du dein Programm beendest. Das mit z.B. Firefox würde ich so machen: Du schreibst folgenden Code in dein Formular:
Delphi-Quellcode:
function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;

  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess( 
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;
Oben in dies Uses- Klause schreibst du dann noch ,tlhelp32 rein. In deinen Timer wo schon das FormX.close drinnensteht schreibst du dann noch KillTast('firefox.exe'); rein und dieser wird dann mit deinem Programm nach der angegebenen Zeit beendet.

Sonst noch Fragen^^


MFG Lars Wiltfang

mkinzler 4. Mai 2008 20:08

Re: Programm nach x Minuten beenden
 
Er startet aber Firefox und kennt deshalb dessen PID! Dein Code schliesst auch eine eventuell andere Firefox-Instanz

DeddyH 5. Mai 2008 08:06

Re: Programm nach x Minuten beenden
 
Das hab ich in #20 ja bereits angedeutet.

mkinzler 5. Mai 2008 08:07

Re: Programm nach x Minuten beenden
 
Ich weiss; es gibt aber andere die den thread wohl nicht ganz gelesen haben

Delphi08 5. Mai 2008 13:43

Re: Programm nach x Minuten beenden
 
okay danke ;)

Delphi-Quellcode:
procedure TForm1.exit(Sender: TObject);
begin
Killtask('firefox.exe');
Form1.Close;
end;
entweder bin ich zu blöd oder sonst was, aber er meint "undef. Bezeichner killtask".
Wenn es außerhalb der Prozedur steht, ist es kein Problem. Aber innerhalb wohl schon :-/

Larsi 5. Mai 2008 14:20

Re: Programm nach x Minuten beenden
 
Die Procedur die "erklärt" was KillTask ist steht vielleicht im Quelltext UNTER dem Timer Event? Schreib die mal weiter nach oben also direkt unter dieses {SR.blabla} oder wie das heißt :)

Delphi08 5. Mai 2008 14:23

Re: Programm nach x Minuten beenden
 
ah okay!
Vielen Dank nochmal an alle dir mir hier helfen konnten ;)

Anfängerfehler :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 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