Ich würde dir C# in Kombination mit der Windows Presentation Foundation (WPF) empfehlen.
Hey,
auch wenn die Frage mit Sicherheit schon in die Jahre gekommen ist, wollte ich noch etwas ergänzen. Ich bin heute durch einen Vorschlag auf diese Frage gestoßen..
Wer zukünftig auf diesen Thread stößt, möchte ggf. meinen Beitrag auf meiner Homepage zum asynchronen Warten ansehen, denn..:
https://robbelroot.de/blog/vbnet-await/
Von einem vorherigen Nutzer wurde ja bereits die Verwendung von z. B.
System.Threading.Thread.Sleep(<wartedauerInMillisekunden>)
vorgeschlagen.
Allerdings ist das wie in deinem Fall für die Verwendung im GUI-Thread mehr als schlecht, da vermutlich alles hängen wird und Du auf nichts mehr zugreifen können wirst.
Danach hatte er eine Sleep-Variante mit Application.DoEvents() vorgeschlagen, um das Einfrieren mehr oder weniger auszutricksen. Diese Methode sollte man ebenso nicht verwenden, denn es geht 1. einfacher und 2. effizienter – mit async/await, also mit Tasks.
Dazu musst Du die Methode einfach nur als "async" kennzeichnen und dort auf die Abarbeitung der Task mit Hilfe von "await" warten.
Ebenso könntest Du für das Hinzufügen von Text innerhalb der RichtTextBox auch die AppendText() Methode, oder die Text-Eigenschaft anders verwenden.
Statt der vbNewLine-Konstante würde sich auch ein Environment.NewLine anbieten.
Je nach VB.NET Version man nutzt etc., kann man auch auf String-Interpolation zurückgreifen (siehe zweite Zeile)
Private Async Sub Button1_Click(sender As object, e As EventArgs) Handles Button1.Click
Do
Dim waitTime = 500 ' oder As Integer explizit..
RichTextBox1.AppendText("Text1" & Environment.NewLine)
Await Task.Delay(waitTime)
RichTextBox1.Text &= $"Text2 {Environment.NewLine}"
Await Task.Delay(waitTime)
Loop
End Sub
Eventuell solltest Du hier auch eine Möglichkeit zur Begrenzung der Schleife einbauen. Also zum Beispiel im FormClosing-Handler ein Boolean-Flag auf False setzen, Welches dann innerhalb der Loop abgefragt wird.
Hey, ich weiß, dass der Beitrag schon was älter ist, aber ich selbst bin heute darauf gestoßen und habe auf meiner Webseite meine eigene Lösung veröffentlicht.
Du findest mögliche Lösungen, Alternativen und den Download unter folgendem Link:
https://robbelroot.de/blog/vbnet-anwendungsdauer-auslesen/
Dort erkläre ich, wie man das Problem lösen kann und welche Unterschiede es z. B. bei Winforms und WPF gibt.
Ebenso gehe ich auf die Möglichkeit einer Erweiterungsmethode ein.
Der fertige Winforms Code sieht so aus:
Module modExtensions
Public Class Extensions
Public Class Application
Public Shared Function GetTimeRunning() As TimeSpan
Dim timeDiff = Date.Now - Process.GetCurrentProcess().StartTime
Return timeDiff
End Function
End Class
End Class
End Module
Und kann so aufgerufen werden:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Debug.WriteLine(Extensions.Application.GetTimeRunning())
End Sub
Bei WPF sieht das ganze Aufgrund der einfach zugreifbaren Application-Instanz anders aus:
Imports System.Runtime.CompilerServices
Module modExtensions
<Extension>
Public Function GetTimeRunning(app As Windows.Application) As TimeSpan
Dim timeDiff = Date.Now - Process.GetCurrentProcess().StartTime
Return timeDiff
End Function
End Module
Aufruf:
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
Dim runningTime = Application.Current.GetTimeRunning()
Debug.WriteLine(runningTime)
End Sub