hapke Geschrieben 3. April 2007 Teilen Geschrieben 3. April 2007 Halli Hallo, habe vor einen Windows Dienst zu entwickeln. Aufgaben sollen sein zu einer bestimmten Uhrzeit und wenn von einem anderen Rechner ein Signal gesendet wird eine bestimmte Funktion auszuführen. Bisherige Überlegungen: Das Signal von außen ist ein String der via Winsock Verbindung gesendet wird. Problem: Wie plaziert man in einem Dienst ein Window Control? Bzw in wiefern ist es möglich dieses auf ein User Control zu plazieren und von dort aufzurufen? Die andere Frage die ich mir auch noch stelle ist, wie man die Systemzeit zu einer bestimmten Zeit "abfängt" vielleicht ohne einen Timer am laufen zu haben der alle 60 Sekunden prüft ob die Uhrzeit erreicht ist um Resourcen zu sparen!? Könnt ihr mir helfen? Habt ihr Ideen? Danke schonmal Timo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bigredeyes Geschrieben 4. April 2007 Teilen Geschrieben 4. April 2007 nimm nen timer! [vorrausgesetzt du hast > 8MHz und > 128kb ram ] alle 60 sekunden kann in einem dummen fall (murphy!!! -> also immer ) bedeuten 16:59:59.89 und nächster tick 17:01:00.08 wenn du nun um 17 uhr was machen willst, hat er es verpennt. wenn du alle 45 sekunden prüfst, kann es sein, dass du 2 x die 17:00 erwischst (17:00:10 und 17:00:55). -> drum niumm nen timer. Problem: Wie plaziert man in einem Dienst ein Window Control? GAR NICHT! ein dienst läuft immer, auch wenn keiner angemeldet ist. neim googlen hast du dieses bestimmt auch schon gefunden: CodeGuru: Creating a Windows Service in VB.NET bigredeyes Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 4. April 2007 Teilen Geschrieben 4. April 2007 die thematik ist im übrigen in der MSDN sehr schön beschrieben. How to: Create Windows Services s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hapke Geschrieben 4. April 2007 Autor Teilen Geschrieben 4. April 2007 Danke erstmal für die bisherigen Antworten. Habe jetzt eine normale Windows Anwendung erstellt und diese mit Hilfe dieses Workshops => vb@rchiv · Dienst mit VB erstellen kann ich die Anwendung jetzt als Dienst installieren. Jetzt habe ich jedoch das Problem das ich die Anwendung als Dienst nicht starten kann Meldung: "Der Dienst 'ServiceWarcher' auf "Lokaler Computer" konnte nicht gestartet werden. Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung" Unten einmal mein aktueller Source Code. Das Prüfen der Systemzeit habe ich jetzt mit einem Timer gelöst wie oben genannt. Zeit Interwall auf 45 Sekunden und in einer Variable das aktuelle Datum, welches beim ersten Aufrufen dann in der Variable gespeichert wird und für den Tag dann nicht mehr ausgeführt wird. Wie gesagt jetzt erstmal das Problem mit dem Starten des Dienstes. Danke Timo Public Class Form1 Dim last_date As Date Dim filenameService As String = "C:/ServiceStatus.log" Dim filenameEvents As String = "C:/ServiceEvents.log" Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Select Case Command() Case "-install" NTService1.Interactive = True If NTService1.Install Then MsgBox("Dienst erfolgreich installiert") Else MsgBox("Dienst konnte nicht installiert werden") End If Application.Exit() Case "-uninstall" If NTService1.Uninstall Then MsgBox("Dienst erfolgreich deinstalliert") Else MsgBox("Dienst konnte nicht deinstalliert werden") End If Application.Exit() Case "-debug" NTService1.Debug = True Case Is <> "" MsgBox("Invalid command option") Application.Exit() Case Else Timer1.Enabled = True NTService1.StartService() Winsock1.Listen() Log(filenameService, "Dienst wurde gestartet") End Select End Sub Private Sub NTService1_Continue(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_ContinueEvent) Handles NTService1.Continue Log(filenameService, "Dienst wurde fortgesetzt") Winsock1.Listen() Timer1.Enabled = True End Sub Private Sub NTService1_Pause(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_PauseEvent) Handles NTService1.Pause Log(filenameService, "Dienst wurde angehalten") Winsock1.Close() Timer1.Enabled = False End Sub Private Sub NTService1_Start(ByVal sender As Object, ByVal e As AxNTService._DNtSvcEvents_StartEvent) Handles NTService1.Start Log(filenameService, "Dienst wurde gestartet") Winsock1.Listen() Timer1.Enabled = True End Sub Private Sub NTService1_Stop(ByVal sender As Object, ByVal e As System.EventArgs) Handles NTService1.Stop Log(filenameService, "Dienst wurde gestoppt") Winsock1.Close() Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If last_date <> Date.Today Then 'If ((Now.Hour = 11) And (Now.Minute <> 23) And (Now.Second < 45)) Then If ((Now.Hour = 4) And (Now.Minute = 0) And (Now.Second < 45)) Then timerCalled() last_date = Date.Today End If End If End Sub Function timerCalled() As Object Try Log(filenameEvents, "Timer Event - Dienst(e) neugestartet") Catch ex As Exception Log(filenameEvents, "Fehler: Timer Event - Dienst(e) neugestartet") End Try End Function Function Log(ByVal datei As String, ByVal info As String) Dim logDatei As New System.IO.StreamWriter(datei, True) logDatei.WriteLine(Now & " - " & info) logDatei.Close() End Function Private Sub Winsock1_DataArrival1(ByVal sender As System.Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Winsock1.DataArrival Dim str As String = "" Winsock1.GetData(str) Dim str_code As String = str.Substring(0, 2) Dim str_name As String = "" If str.Length <> 2 Then str_name = str.Substring(3, str.Length - 3) End If Select Case str_code Case "/1" 'Disconnect System.Threading.Thread.Sleep(5000) Winsock1.Close() Log(filenameEvents, "Verbindung geschlossen") Winsock1.Listen() Case "/2" 'Starten Log(filenameEvents, "Dienst Starten (" & str_name & ")") Case "/3" 'Beenden Log(filenameEvents, "Dienst Beenden (" & str_name & ")") Case "/4" 'Pause Log(filenameEvents, "Dienst Pause (" & str_name & ")") Case "/5" 'Restarte Log(filenameEvents, "Dienst Restarte (" & str_name & ")") End Select End Sub Private Sub Winsock1_ConnectionRequest1(ByVal sender As System.Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles Winsock1.ConnectionRequest Winsock1.Close() Winsock1.Accept(e.requestID) Log(filenameService, "Neue Verbindung Aufgebaut") End Sub End Class Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 4. April 2007 Teilen Geschrieben 4. April 2007 dein code compiliert ohne fehler und warnungen? dein dienst heisst wirklich "ServiceWarcher"? hast du versucht, den dienst sowohl über net start, als auch über MMC zu starten? wo behandelst du eigentlich die Winsock-einstellungen wie den port, auf dem gelauscht wird? du läufst in den ERROR_SERVICE_REQUEST_TIMEOUT, d.h. dein dienst benötigt zu lange. ich würde versuchen, den Timer erst nach starten des dienstes in den status Enabled zu versetzen. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hapke Geschrieben 4. April 2007 Autor Teilen Geschrieben 4. April 2007 dein code compiliert ohne fehler und warnungen? Ja dein dienst heisst wirklich "ServiceWarcher"?Ups nein er heißt ServiceWatcher hast du versucht, den dienst sowohl über net start, als auch über MMC zu starten?habe ihn über net start gestartet und über die verwaltung (glaube auch mmc abgekürzt bin mir aber nicht ganz sicher) wo behandelst du eigentlich die Winsock-einstellungen wie den port, auf dem gelauscht wird?Die habe ich direkt im Control angegeben. LocalPort und RemotePort: 8080 / Protokoll: sckTCPProtocol du läufst in den ERROR_SERVICE_REQUEST_TIMEOUT, d.h. dein dienst benötigt zu lange. ich würde versuchen, den Timer erst nach starten des dienstes in den status Enabled zu versetzen.Funktioniert leider auch noch nicht. Habe das Timer1.Enabled = True unter NTService1_Start gesetzt. Leider ohne Erfolg. Auch durch erstellen eines Threads bekomme ich den Dienst nicht gestartet. In der Verwaltung unter Dienste steht er generell immer als "Wird gestartet" wenn ich versuche ihn zu starten und er auf die Fehlermeldung läuft. Danach nur noch zu beenden über den Taskmanager. Timo Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.