Form hängt bei Ticken eines Timers im Chat

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Form hängt bei Ticken eines Timers im Chat

    Ich habe ein nerviges Problem. Ich bin momentan am Schreiben eines Chattes. Nun aktualisiert der Timer (Timer1) alle 3 Sekunden den Verlauf. So weit so gut. Nur immer wenn er alle 3 Sekunden aktualisiert, dann hängt der Chat. Und wenn man dann am Schreiben ist, ist das schon ganz schön nervig. Ich habe schon mal etwas gegooglet und etwas von einem "Timers.Timer anstatt Windows.Forms.Timer nehmen" gehört. Dort wurde auch gesagt, wie das ganze zu machen ist. Aber da bin ich nicht durchgestiegen.

    Das hier ist mein kompletter Code... Ich denke zwar nicht, dass der zu gebrauchen ist, weil es nur um den Timer geht, aber falls doch, dann ist es einfach herauszulesen. Was ich erstmal nicht möchte, sind Verbesserungsvorschläge. Die nehme ich gerne entgegen, wenn ich das Timer-Problem gelöst habe:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox_nachricht.TextChanged
    3. Label1.Text = TextBox_nachricht.TextLength
    4. End Sub
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    6. Timer1.Interval = 3000
    7. Dim webclient As New Net.WebClient
    8. webclient.Credentials = New Net.NetworkCredential("Nutzername", "Passwort")
    9. Try
    10. TextBox_chat.Text = webclient.DownloadString("Server")
    11. Catch ex As Exception
    12. MsgBox("Fehler 1 ; Der Verlauf konnte nicht heruntergeladen werden!", MsgBoxStyle.Information, "Fehler")
    13. End Try
    14. TextBox_chat.SelectionStart = TextBox_chat.Text.Length
    15. TextBox_chat.ScrollToCaret()
    16. End Sub
    17. Private Sub Button_senden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_senden.Click
    18. Dim webclient As New Net.WebClient
    19. webclient.Credentials = New Net.NetworkCredential("Nutzername", "Passwort")
    20. If TextBox_nachricht.Text <> "" Then
    21. ProgressBar.Value = 35
    22. Try
    23. webclient.UploadString("Server", TextBox_chat.Text & "<" & Label4.Text & "-" & My.Computer.Clock.LocalTime.Hour & ":" & My.Computer.Clock.LocalTime.Minute & ">: " & TextBox_nachricht.Text & vbNewLine & vbNewLine)
    24. TextBox_nachricht.Clear()
    25. Catch ex As Exception
    26. MsgBox("Fehler 2 ; Die Nachricht konnte nicht gesendet werden!", MsgBoxStyle.Information, "Fehler")
    27. End Try
    28. ProgressBar.Value = 90
    29. Try
    30. TextBox_chat.Text = webclient.DownloadString("Server")
    31. Catch ex As Exception
    32. MsgBox("Fehler 1 ; Der Verlauf konnte nicht heruntergeladen werden!", MsgBoxStyle.Information, "Fehler")
    33. End Try
    34. ProgressBar.Value = 100
    35. Else
    36. MsgBox("Ein leeres Textfeld kann nicht gesendet werden!", MsgBoxStyle.Information, "Fehler")
    37. End If
    38. TextBox_chat.SelectionStart = TextBox_chat.Text.Length
    39. TextBox_chat.ScrollToCaret()
    40. ProgressBar.Value = 0
    41. End Sub
    42. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    43. Dim webclient As New Net.WebClient
    44. webclient.Credentials = New Net.NetworkCredential("Nutzername", "Passwort")
    45. Try
    46. TextBox_chat.Text = webclient.DownloadString("Server")
    47. Catch ex As Exception
    48. MsgBox("Fehler 1 ; Der Verlauf konnte nicht heruntergeladen werden!", MsgBoxStyle.Information, "Fehler")
    49. End Try
    50. End Sub
    51. Private Sub Form1_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    52. Dim webclient As New Net.WebClient
    53. webclient.Credentials = New Net.NetworkCredential("Nutzername", "Passwort")
    54. Try
    55. TextBox_chat.Text = webclient.DownloadString("Server")
    56. TextBox_chat.SelectionStart = TextBox_chat.Text.Length
    57. TextBox_chat.ScrollToCaret()
    58. Catch ex As Exception
    59. MsgBox("Fehler 1 ; Der Verlauf konnte nicht heruntergeladen werden!", MsgBoxStyle.Information, "Fehler")
    60. End Try
    61. End Sub
    62. Private Sub TextBox_chat_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox_chat.TextChanged
    63. TextBox_chat.SelectionStart = TextBox_chat.Text.Length
    64. TextBox_chat.ScrollToCaret()
    65. End Sub
    66. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    67. TextBox_chat.SelectionStart = TextBox_chat.Text.Length
    68. TextBox_chat.ScrollToCaret()
    69. Timer2.Stop()
    70. End Sub
    71. End Class


    Ich habe alle geheimen Daten (Server-.txt-Datei-Pfad, Username und Passwort) durch "Server", "Nutzername" und "Passwort" ersetzt.

    PS: Was den Timer 2 angeht... Der stört nicht, der ist nur dafür zuständig, dass der Chat am Anfang unten startet. Unter Form1_Load hat es nicht funktioniert. Das selbe Problem hatte ich auf einem anderen Rechner auch so gelöst. Es geht somit nur um den Timer1...
    @RaceShafter Editiere mal Deinen Beitrag, markiere den Code und die Code-Tags und drück auf das Auge (Spoiler einfügen).
    Das, was im Timer1 abläuft, solltest Du asynchron machen, da kannst Du diesen Timer ganz raus schmeißen.
    @sonne75 Nur die mit Handles MyBase.Load ist aktiv.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    sonne75 schrieb:

    aber wozu postet er beide?
    Weil er noch nicht gelernt hat, seinen Code permanent aufzuräumen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der Timer kann bereits im Designer auf Enabled=True gesetzt sein.
    Zum Problem selbst (abgesehen davon, dass das dieses System nicht wirklich sicher ist):

    Du musst das Runterladen des Strings Asynchron oder in einem andere Thread machen um die GUI nicht zu blockieren. Per Invoke kannst du dann deine Chat-Textbox aktualisieren.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    RaceShafter schrieb:

    Private Sub Form1_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim webclient As New Net.WebClient
    webclient.Credentials = New Net.NetworkCredential("Nutzername", "Passwort")


    Sinnvoll bei jedem TimerTick ein neues Objekt zu erstellen? Wenn du den WebClient einmal erstellt hast, kannst du ihn doch jedesmal wieder verwenden und musst ihn nicht immer neu erstellen.

    Korriegiert mich sofern ich keine Ahnung davon habe :D
    @sonne75
    Start macht im Prinzip nichts anderes als Enabled=True zu setzen. Im Set Teil der Enabled Property passiert dann die eigentliche "Magie" des Startens.
    Und das kann eben bereits im Designer geschehen.

    @shaebich
    Das Objekt wird im Normalfall vom GC verworfen wenn es nicht mehr benötigt wird. Obwohl natürlich ein Using schöner wäre.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    RaceShafter schrieb:

    Nun aktualisiert der Timer (Timer1) alle 3 Sekunden den Verlauf.

    Ähm, sollte ein Chat-Verlauf nicht exakt dann aktualisiert werden, wenn eine neue Nachricht eingegangen ist? Löse doch beim Empfang einer nachricht ein Event aus, dass dann die aktualisierungsprozedur aufruft. Nur so mal als Denkanstoß.
    Es geht hier ja nicht um Timer2 sondern Timer1. (Sagte der TE ja im Starpost, dass Timer2 nur für die erste Anzeige ist).

    @RaceShafter
    - Lagere das Aktualisieren des Chats in eine eigene Methode aus.
    - Diese Methode wird einmal vom Form_Load Event ausgeführt und sonst von Timer1 (somit kannst Timer2 komplett entfernen)
    - Für das Aktualisieren musst du per Invoke die Textbox des Chats ändern, da der Zugriff von einem anderen Thread aus erfolgt.

    Denke das sind mal einige Anhaltspunkte mit denen du arbeiten kannst.

    @EaranMaleasi
    Der Text des Chats liegt in einem File wie es aussieht. Somit kann da nicht wirklich ein Event gefeuert werden denk ich mal.

    Ich hoffe, dass ist kein FTP Chat da diese wegen der Sicherheitsproblematik in diesem Forum eigentlich nicht unterstützt werden. (Hier gibt es andere Möglichkeiten. Glaube sogar es gibt hier im Forum ein Tutorial dazu)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Timer 1 und 2 werden nicht per Code gestartet. Ich habe das bei denen so eingestellt. Sorry, aber ich kann mit "Invoke" und anderen Begriffen nichts anfangen. Ich bin eben erst ganz am Anfang und kenne mich nicht aus, deswegen ist der Chat-Code auch noch lange nicht perfekt. Und ja, es ist ein FTP-Chat. Und es ist mir völlig egal, ob der verboten ist oder nicht. Das lasst mal meine Sorge sein, denn ich habe das schon gut geregelt, ohne, dass man dahinter kommt. Ich brauche keine Erklärungen, was ich machen soll. Ich brauche Codes mit Erklärungen der Codes. Ich kann nämlich die Erklärungen nicht umsetzen, weil ich keinen Schimmer habe wie. Den Chat habe ich auch nur mit Hilfe von YouTube geschrieben... Ich arbeite ja noch an diesem Teil...

    Falls ich unfreundlich rüberkomme, entschuldige ich mich dafür... Danke für eure Hilfe :D
    Du widersprichst dir selbst:

    RaceShafter schrieb:

    Ich bin eben erst ganz am Anfang und kenne mich nicht aus


    RaceShafter schrieb:

    weil ich keinen Schimmer habe wie


    RaceShafter schrieb:

    Den Chat habe ich auch nur mit Hilfe von YouTube geschrieben


    Allerdings:

    RaceShafter schrieb:

    Und es ist mir völlig egal, ob der verboten ist oder nicht. Das lasst mal meine Sorge sein, denn ich habe das schon gut geregelt, ohne, dass man dahinter kommt


    Ich werde den Thread gleich melden, denn das:

    RaceShafter schrieb:

    Ich brauche keine Erklärungen, was ich machen soll. Ich brauche Codes mit Erklärungen der Codes


    ist hier ebenfalls nicht gern gesehen.
    Gerade als Neuling sollte es einem nicht egal sein, was andere sagen, denn sie wollen DIR ihr WISSEN anbieten, was du aber direkt mit Füßen trittst.

    Des Weiteren, Vergiss Youtube, 90% dieser Videos sind nachweißlich Müll. Bleib auf Websiten und in Büchern.
    Hier auf VBP gibt es ein Tutorial eines einfachen Chats, der dir das alles ohne FTP Server erlaubt, such mal danach.
    Ich trete nicht mit Füßen. Nur mit Erklärungen kann ich nichts anfangen. Sondern ich brauche Codes, mit Erklärungen. Ein Code, und dann im Einzelnen erklären, was für was steht. Das ist meine Taktik zu lernen. Denn wie soll ich schreiben, wenn ich keine Ahnung habe, wie? Eben, geht nicht. Und es ist mir nicht egal... Ich versuche doch, zu verstehen. Aber anscheinend versteht ihr mich nicht... Und @sonne75 , dann melde doch den Thread. Ich kann doch wohl programmieren, wie ich möchte. Und ich kann meine Daten laufen lassen, worüber ich möchte, denn es ist ja mein Programm. Und wem es nicht passt, der braucht mir nicht helfen. Ich habe kein Buch oder sonstige Kenntnisse. Und klar, wenn man Ahnung hat, dann kann man den Chat auch einlesen, aber wen interessiert schon, was ich mit meinem Kumpel schreibe? Ob man das weiß oder in China ein Sack Reis umfällt, ist das Selbe.

    shaebich schrieb:

    Sinnvoll bei jedem TimerTick ein neues Objekt zu erstellen? Wenn du den WebClient einmal erstellt hast, kannst du ihn doch jedesmal wieder verwenden und musst ihn nicht immer neu erstellen.


    Bin gerade nochmal auf deinen Beitrag zurückgekommen... Könnte ich dass auch unter "Public Class Form1" schreiben. Quasi, dass er nur noch den neuen Inhalt herunterlädt und nicht alle 3 Sekunden sich einwählt...