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 Command := ExtractFilePath(Application.ExeName) + 'ksu_server.exe'; DosCommand2.CommandLine := Command; Memo1.Text := Command; DosCommand2.Execute; end; begin 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 public 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
Petros - So 04.07.10 20:59
Danke jaenicke werds gleich mal testen
//edt danke Läuft sogar noch besser
MFG Petros
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!