Entwickler-Ecke

Sonstiges (Delphi) - Brauche hilfe für eine Timer funktion


Petros - Do 10.06.10 17:15
Titel: Brauche hilfe für eine Timer funktion
Hi an alle delphi freunde

Ich habe mal wieder ein problem und komme nicht weiter, und zwar wie oben beschrieben brauche ich hilfe bei einer Timer Funktion.

Ich habe einen handler geschrieben der folgenes tut.
Er startet einen Server wo ich auch eine Update funktion eingefügt habe.
Mein problem ist es das ich wenn ich es dann starte wieder beenden muss, dann wieder starten und dann erst das update benutzen kann.
Das gleiche muss ich auch machen wenn ich nur die CMD fenster benutze.

Ich möschte es gern so machen:

Ich Start den Server und Klicke dann auf Update.
Dann soll der Server beendet werden das geschiet über taskkill, der Händler ist aber noch offen.

Dann soll der Server dann wieder starten (automatisch nach 1 sec), und dann eine weitere secunde dann die update funktion starten.

Das ganze läuft über DosCommand.

Wie bekomm ich das hin bin voll am verzweifeln

MFG Petros

Edit/ so sollte jetzt besser ich habe nur ein Tablett PC ist ein bisschen umständlich beim schreiben als am PC


Xentar - Do 10.06.10 17:20

Könntest du da erstmal ein paar Satzzeichen und Groß- / Kleinschreibung einfügen, sodass man deinen Text auch vernünftig lesen kann?


Petros - Fr 11.06.10 14:52

Habe den Text jetzt nochmal verändert hoffe ist jetzt besser....

LG Petros


bummi - Fr 11.06.10 15:32

Ich würde Dir gerne helfen, verstehe aber immer nocht nicht was Du eigentlich machen willst.
Wieviele Programme sind beteiligt?
Wieviel davon sind Dienste?
Wer soll wen steuern?

MfG
Bummi


ALF - Fr 11.06.10 15:39

Hi, ich versuch mal dies zu verstehen.
Du startest einen Server (Linux/Windows) oder was meinst Du mit Server!?
Dieser soll sich oder etwas anderes Updaten!?
Dein Problem, das er es nicht automatisch macht!?

Würde eventuell sagen das Deine Procedure nicht richtig aufgerufen wird.
Vielleicht brauchst Du keinen Timer, wenn Du uns mal die Aufrufe zeigst. So könnte man evtl erkennen was Falsch ist bzw. was man anders machen kann!

Ansonsten vielleicht mal richtig formulieren. Denn Du bist der einzigste der es ja versteht was Du kongret machst, machen willst!
Wir können nur raten!
Gruss Alf


Petros - Fr 11.06.10 18:40

Also ich versuche es mal genau zu erklären....

Es handelt sich um ein Voice Video Server der läuft auf einem Windows Server 2008..

Die start und Stop Funktion funktionieren ohne problem... mir geht es genau um die updaten funktion..

Der server ist noch eine beta Test version und muss regelmäßig ein update machen...

Das Problem dabei ist das ich wenn ich nun ein update machen will den Server Starten dann wieder Beenden und dann wieder starten muss und kann dann erst ein updaten installieren.

Es soll so funktionieren das wenn ich auf update klicken der Server dann beendet wird und dann wieder automatisch startet und dann 1sec später die update funktion ausführt..

das selbe muss ich auch machen ohne das programm was ich grad mache

kurze erläuterung
ich starte ksu_server.exe es öffnet sich ein CMD fenster.. bevor ich die ksu_update.bat benutze kann muss ich ihn wieder beenden dann neu starten und dann kann ich erst ksu_update.bat benutzen.

ich versuch es mal in einem kleinem beispiel zu erläutern


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.btnupClick(Sender: TObject);
var
 Command : String;
  begin
    KillTask('ksu_server.exe');
    Memo1.Lines.Clear;
    Memo2.Lines.Clear;
end;
begin // nach dem beenden startet der ksu_server.exe wieder automatisch
    Command := ExtractFilePath(Application.ExeName) + 'ksu_server.exe';
    DosCommand2.CommandLine := Command;
    Memo1.Text := Command;
    DosCommand2.Execute;
end;
begin //das update soll dann 1 sec später automatisch starten nach dem neustart
    Command := ExtractFilePath(Application.ExeName) + 'ksu_update.bat';
    DosCommand2.CommandLine := Command;
    Memo2.Text := Command;
    DosCommand2.Execute;
end;


das ganze soll dann mit nur 1 klick funktionieren wenn ich auf btnup klicke

Ich hoffe das ich es diesmal etwas genauer erklären konnte

Hier nochmal der gesamte Quelltext


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DosCommand, StdCtrls, Tlhelp32, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Memo2: TMemo;
    btnstart: TButton;
    btnstop: TButton;
    btnup: TButton;
    DosCommand1: TDosCommand;
    DosCommand2: TDosCommand;
    procedure btnstartClick(Sender: TObject);
    procedure btnstopClick(Sender: TObject);
    procedure btnupClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;

procedure TForm1.btnstartClick(Sender: TObject);
var
 Command : String;
  begin
    Memo1.Lines.Clear;
    Command := ExtractFilePath(Application.ExeName) + 'ksu_server.exe';
    DosCommand1.CommandLine := Command;
    Memo1.Text := Command;
    DosCommand1.Execute;
end;

procedure TForm1.btnstopClick(Sender: TObject);
begin
 KillTask('ksu_server.exe');
end;

procedure TForm1.btnupClick(Sender: TObject);
var
 Command : String;
  begin
    Memo2.Lines.Clear;
    Command := ExtractFilePath(Application.ExeName) + 'ksu_update.bat';
    DosCommand2.CommandLine := Command;
    Memo1.Text := Command;
    DosCommand2.Execute;
end;

end.


MFG Petros

PS. Bitte achtet nicht auf Rechtschreibfehler da ich nur eine virtuelle Tastertur habe und die manschmal nicht so schnell reagiert..


ALF - Fr 11.06.10 19:15

Hi
Warum der Server erst gestartet werden muss dann beendet, wieder gestartet dann update mhhh entzieht sich meiner logik.
Müsste nicht normalerweise erst update ausreichen, dann Serverneustarten sein!? mh...

Gut, ansonsten folgenden Vorschlag.
in Deiner btnupClick Procedure
rufst du die startProcedure für den Server auf,
setzt ein sleep,
rufst die StopProcedure auf, oder KillProcedure
setzt ein sleep,
dann wieder die startprocedure,
setzt ein sleep
dann den Aufruf des Update

Theoretisch müsste jetzt nach dem Update ein Neustart erfolgen!!!! Warum Du dies anders machst mhh...

Die sleeps dienen dazu das Dein Server erst mal richtig hochfährt, dann wieder richtig down geht, dann wieder startet usw. :eyecrazy:
Wie lange Dein Server Zeitbenötigt um Hoch und runterzufahren wirst Du sicherlich wissen, danach richtet sich auch die sleep-zeit.
Ein Timer währe sicherlich besser, müsste aber selbst erst überlegen wie das umzusetzen währe :oops:
Zumal Du dadurch auch ne aktuelle Anzeige hast, in welchem Status sich dein Prog gerade befindet.
Noch besser ist den Server abzufragen ob er online ist um ihn wieder down zu machen usw.
Auf die schnelle währe dies ein billiger Vorschlag :roll:

Gruss Alf


Petros - Sa 03.07.10 18:24

Jo danke Alf das mit der Sleep funktion hat wunderbar funktioniert und macht dann auch genau das was ich mir vorgestellt hatte


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.btnupClick(Sender: TObject);
var
 Command : String;
  begin
    KillTask('ksu_server.exe');
    Memo1.Lines.Clear;
    Memo2.Lines.Clear;
sleep(1000);
    Command := ExtractFilePath(Application.ExeName) + 'ksu_server.exe';
    DosCommand2.CommandLine := Command;
    Memo1.Text := Command;
    DosCommand2.Execute;
sleep(1000);
    Command := ExtractFilePath(Application.ExeName) + 'ksu_update.bat';
    DosCommand2.CommandLine := Command;
    Memo2.Text := Command;
    DosCommand2.Execute;
end;


Vielen Vielen Dank


jaenicke - So 04.07.10 10:38

Und wenn dein Programm derweil noch reagieren soll, kannst du Delay statt Sleep benutzen:
http://www.delphipraxis.net/topic7355_delay+revisited.html


Petros - So 04.07.10 20:59

Danke jaenicke werds gleich mal testen

//edt danke Läuft sogar noch besser

MFG Petros