PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konsolen Programm soll unendlich lange laufen.


tsaG
2009-01-06, 17:07:28
Hi, ich bin jetzt mit einem Programm auf Console umgestiegen, Forms waren einfach sinnlos und overkill. Nun soll das Programm (ua.) einen timer starten bei dem ein Event geraised (in diesem fall ein "Hallo" in die Console geschrieben) wird. Wie funktioniert das ganze denn? Wenn ich den Code so laufen lasse geht er auf, und sofort wieder zu.

Imports System.Threading.Thread
Imports System.Console
Imports System.Net

Module Module1

Sub Main()
WriteLine("Programm gestartet..")
Begin()

End Sub

Sub begin()
WriteLine(Date.Now + ": Timer wird nun gestartet")
'Stats timer Starten
Dim t As New System.Timers.Timer

t.Interval = 1000

AddHandler t.Elapsed, AddressOf timer_Tick

t.Start()

End Sub

Public Sub timer_Tick(ByVal sender As Object, ByVal e As EventArgs)
Writeline("Hallo")
End Sub
End Module

Dies soll nun eigentlich unendlich weiter laufen, sodass alle 1000ms ein Hallo in die Console geschrieben wird, wie mache ich das am besten ohne, dass sich das Program schließt?

Monger
2009-01-06, 17:37:46
Das simpelste ist: warte auf eine Benutzereingabe. Erst wenn der Anwender eine bestimmte Taste drückt, läuft das Programm dann weiter, aus der Main raus, und schließt sich, und damit alle abhängigen Threads.

Der Timer ist hier ja bereits in einem separaten Thread, und hat so gesehen nichts mehr mit der Main zu tun.

Edit: Probier mal Console.ReadLine() oder Read()aus. Bin mir nicht mehr ganz sicher ob er dann tatsächlich auf irgendwas wartet, aber probiers einfach mal aus.

Gnafoo
2009-01-06, 19:38:25
Rufe am Ende der Main-Methode Application.Run() auf. Dann läuft das Programm in die übliche Message-Loop. Willst du das Programm dann irgendwann beenden, musst du Application.Exit() aufrufen, dann wird die Run-Methode wieder verlassen.

Edit: du kannst dann afaik auch die Windows.Forms.Timer-Klasse verwenden. Dann läuft das Timer-Event im selben Thread wie die Anwendung selbst. Funktioniert aber natürlich nur mit Application.Run().

Monger
2009-01-06, 20:14:41
@Gnafoo: Das hier ist ja eine Konsolenapplikation. Da gibts keine Message Loop auf die du warten könntest.

Gnafoo
2009-01-06, 20:44:27
Das funktioniert auch ohne Fenster, bzw. mit einer Konsolenanwendung (habs grad getestet). Allerdings muss man dann System.Windows.Forms zu den Referenzen hinzufügen.

Aber eigentlich dachte ich auch an die Windows.Forms-Anwendung ohne Fenster (mit Tray-Icon), an der ich vor ein paar Tagen gebastelt hatte und habe gar nicht an den Konsolen-Aspekt gedacht, da hast du recht. :D

Gast
2009-01-09, 18:32:11
Und wozu der ganze Aufwand mit der Konsole? Ich würde einfach ein Form machen, eine RichTextBox einfügen, diese auf Readonly setzen und dann andocken. Damit ist man viel flexibler. Beim Timer zieht man einfach aus der Toolbox einen auf die Applikation, schaltet diesen im Main mit .Enabled ein und schon gehts los.

Dann kann der User nach belieben Resizen, man kann einfacher raus kopieren usw.

Superguppy
2009-01-09, 18:34:23
Ich würde so etwas wie Thread.sleep(1000); (falls das in VB geht) machen. Das Ganze in einer while-Schleife und halt immer nach dem Sleep die Ausgabe machen. =)

Monger
2009-01-09, 19:15:46
Und wozu der ganze Aufwand mit der Konsole?
Das muss der TS wissen ;) , aber die Konsole hat schon so einige Vorteile. Zum einen ist sie sehr einfach und leichtgewichtig, man muss sich nicht erstmal mit irgendwelchen Controls rumprügeln. Zum anderen hat die Konsole schon bereits vordefinierte Datenströme für Input, Output und Error. Das kann mitunter schon sehr praktisch sein.

Wenn man überhaupt kein Ausgabefenster möchte, wäre eigentlich die konsequenteste Lösung, einen Windows Dienst zu registrieren. Das erfordert aber halt auch nochmal extra Gehirnschmalz.