Form friert ein trotz thread und double puffered?

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von timmi31061.

    Form friert ein trotz thread und double puffered?

    Hallo,

    ich habe ein kleines problem, undzwar während mein Programm arbeitet, hängt es sich auf und die Progressbar und alles arbeitet nicht (zumindestens visuell nicht) habe es schon mit thread und double puffered auf True gesetzt. trotzdem hakt die form, wenn man sie zum beispiel bewegen will.

    gibt es noch eine Möglichkeit?

    Zwäähn schrieb:

    Versuchs mit dem Backgroundworker und nehm einen anderen Thread und nicht den Hauptthread

    1) sind BackgroundWorker ne alte Sache und die sind imo nur sinnvoll, wenn man Progress berichtet. Ansonsten gibt es besseres, wie Tasks etc.
    2) hat er ja schon nen eigenen Thread.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    1) sind BackgroundWorker ne alte Sache und die sind imo nur sinnvoll, wenn man Progress berichtet. Ansonsten gibt es besseres, wie Tasks etc.


    Naklar, mein Fernseher ist jetzt auch schon 1,5 Jahre alt, den benutz ich nicht mehr!
    Natürlich gibts noch ein paar andere Möglichkeiten (ThreadPool, Tasks, Async etc)
    Der BGW ist z.b. bzw nur geeignet wenn man mit der UI interagieren will (Statusabfragen z.b.).

    Oder Threadpool ist z.b. effizienter und recht einfach zu handlen (und weniger Aufwand).

    jedem das seine :P
    Kommt immer drauf an was man gerade anstellen will.
    Mag zwar sein das der BGW schon veraltet ist aber solange MS diesen nicht entfernt, warum sollte man ihn nicht nutzen?

    Er hat übrigens noch keinen Code gepostet...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Zwäähn“ ()

    So hier der Code musste es wieder zurückschreiben, da ich erstmal das tutorial von Zwään durchgearbeitet aber ohne erfolg.

    so hier:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Threading
    4. Public Class Form1
    5. Dim th As New System.Threading.Thread(AddressOf Durchlauf)
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. OpenFileDialog1.ShowDialog()
    8. ListBox1.Items.AddRange(IO.File.ReadAllLines(OpenFileDialog1.FileName))
    9. Button2.Enabled = True
    10. Label2.Text = ListBox1.Items.Count
    11. End Sub
    12. Sub Durchlauf(ByVal s As String)
    13. Try
    14. Dim myRequest As HttpWebRequest = CType(WebRequest.Create("http://www.google.de/"), HttpWebRequest)
    15. myRequest.Method = "GET"
    16. myRequest.ContentType = "application/x-www-form-urlencoded"
    17. myRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
    18. myRequest.Timeout = 5000
    19. myRequest.CookieContainer = New CookieContainer
    20. Dim proxy As New WebProxy(s)
    21. myRequest.Proxy = proxy
    22. Dim myResponse As System.Net.WebResponse = myRequest.GetResponse()
    23. Dim myStream As System.IO.Stream = myResponse.GetResponseStream()
    24. Dim myReader As New System.IO.StreamReader(myStream)
    25. ListBox2.Items.Add(s)
    26. ProgressBar1.Value += 1
    27. myReader.Close()
    28. Button2.Enabled = False
    29. Button3.Enabled = False
    30. Button4.Enabled = True
    31. Catch ex As Exception
    32. End Try
    33. End Sub
    34. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    35. For i As Integer = 0 To Me.ListBox1.Items.Count - 1
    36. Durchlauf(Me.ListBox1.Items(i))
    37. Next
    38. th.Start()
    39. End Sub
    40. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    41. End Sub
    42. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    43. SaveFileDialog1.ShowDialog()
    44. For i = 0 To ListBox2.Items.Count - 1
    45. Dim writer As New StreamWriter(SaveFileDialog1.FileName & ".txt", True)
    46. writer.WriteLine(ListBox2.Items(i).ToString)
    47. writer.Close()
    48. Next
    49. End Sub
    50. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    51. th.Abort()
    52. Button3.Enabled = False
    53. Button2.Enabled = True
    54. End Sub
    55. End Class

    aber es nur die form friert ein.
    Hey,

    1. Dass Dein Thread so keinen Sinn macht, ist Dir klar? Du führst die Arbeit auf dem GUI-Thread aus, kein Wunder, wenn dieser blockiert.
    2. OPTION STRICT ON
    3. Für Dein Vorhaben würde sich auch die WebClient-Klasse eignen, diese bietet asynchrone Methoden, die Du nutzen kannst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Es kann sein, dass da irgendwo ein Fehler ist, weil etwas nicht funktioniert. Ein Fehler wird dir -je nach art- wegen dem Try-Catch nicht angzeigt. Nimm das mal raus, oder mache ein Schritt für Schritt Debugging. (Ich glaube genau für sowas hat Microsoft die Funktionen ja implementiert).
    so hab jetzt alles überarbeitet mit Option Strict On, aber er meckert immer an dieser zeile:

    VB.NET-Quellcode

    1. Dim star As New ThreadStart(AddressOf Durchlauf) '<- hier mekert er


    Hier der gesamte Code:


    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Threading
    5. Public Class Form1
    6. Private Sub laden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles laden.Click, laden.Click
    7. OpenFileDialog1.ShowDialog()
    8. ListBox1.Items.AddRange(IO.File.ReadAllLines(OpenFileDialog1.FileName))
    9. start.Enabled = True
    10. Label2.Text = CStr((ListBox1.Items.Count))
    11. End Sub
    12. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles start.Click
    13. For i As Integer = 0 To Me.ListBox1.Items.Count - 1
    14. Durchlauf(CStr(Me.ListBox1.Items(i)))
    15. Next
    16. End Sub
    17. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save.Click
    18. SaveFileDialog1.ShowDialog()
    19. For i = 0 To ListBox2.Items.Count - 1
    20. Dim writer As New StreamWriter(SaveFileDialog1.FileName & ".txt", True)
    21. writer.WriteLine(ListBox2.Items(i).ToString)
    22. writer.Close()
    23. Next
    24. End Sub
    25. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles break.Click
    26. Dim star As New ThreadStart(AddressOf Durchlauf) '<- hier mekert er
    27. Dim einheit As New Thread(star)
    28. break.Enabled = False
    29. start.Enabled = True
    30. End Sub
    31. Private Sub Durchlauf(ByVal s As String) '<- für den thread
    32. Dim myRequest As HttpWebRequest = CType(WebRequest.Create("http://www.google.de/"), HttpWebRequest)
    33. myRequest.Method = "GET"
    34. myRequest.ContentType = "application/x-www-form-urlencoded"
    35. myRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"
    36. myRequest.Timeout = 5000
    37. myRequest.CookieContainer = New CookieContainer
    38. Dim proxy As New WebProxy(s)
    39. myRequest.Proxy = proxy
    40. Dim myResponse As System.Net.WebResponse = myRequest.GetResponse()
    41. Dim myStream As System.IO.Stream = myResponse.GetResponseStream()
    42. Dim myReader As New System.IO.StreamReader(myStream)
    43. ListBox2.Items.Add(s)
    44. ProgressBar1.Value += 1
    45. myReader.Close()
    46. start.Enabled = False
    47. break.Enabled = False
    48. save.Enabled = True
    49. End Sub
    50. End Class
    Was meckert er? Bestimmt irgendwas wegen dem Parameter. Musste Dir halt den korrekten Parameter bei MSDN oder im Objektkatalog anschauen bzw. ich sehe grade, dass der nen Parameter will. Dann musst Du halt nen anonymen Delegaten oder sowas verwenden oder nen ParameterizedThreadStart.
    1. Du produzierst ziemliche Speicherlecks, weil Du Dialoge, Response-Zeugs etc. nicht diposen tust. Nutze dafür immer einen Using-Block.
    2. CStr etc. sind Abstammungen von CType und eher hässlich. Schau dazu: Konvertieren - wie funktionierts richtig
    Verlasse Dich dabei also nicht auf die VS-Vorschläge, die sind zu 95% Mist.
    3. Benenne Deine Controls etc. richtig. Ich glaube kaum, dass Du zum Beispiel irgendwann weißt, was ein Control genau macht.
    4. Trenne GUI und Daten. Erstelle also erst Variablen und binde diese dann an ein Label.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Darf ich fragen warum du Option Strict On in deinem Code schreibst? Das kannst du doch einfach in den Projekt-Eigenschaften einstellen.
    Es existiert ein Interesse an der generellen Rezession der Applikation relativ primitiver Methoden komplimentär zur Favorisierung adäquater komplexer Algorithmen.
    ------------------------------------------------------------------------------------
    Rising Existence - das GTA V-MP Projekt mit Zukunft und Innuvation

    Maik H. schrieb:

    in den Projekt-Eigenschaften einstellen.
    Im Studio einstellen, da ist es bei jedem neuen VB-Projekt automatisch gesetzt.
    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!

    RodFromGermany schrieb:

    Maik H. schrieb:

    in den Projekt-Eigenschaften einstellen.
    Im Studio einstellen, da ist es bei jedem neuen VB-Projekt automatisch gesetzt.

    Oder so. ;)
    Es existiert ein Interesse an der generellen Rezession der Applikation relativ primitiver Methoden komplimentär zur Favorisierung adäquater komplexer Algorithmen.
    ------------------------------------------------------------------------------------
    Rising Existence - das GTA V-MP Projekt mit Zukunft und Innuvation

    Trade schrieb:

    Was meckert er?
    Er meckert, weil ParameterizedThreadStart ein Object will, aber einen String bekommt.

    @licere
    Nutze lieber Delegaten mit .BeginInvoke()

    VB.NET-Quellcode

    1. Public Delegate Sub ThreadDelegate(text As String, zahl As Integer)
    2. Public Sub StartThread()
    3. Dim t As New ThreadDelegate(Sub(txt, n)
    4. Console.WriteLine(txt)
    5. Console.WriteLine(n)
    6. End Sub)
    7. t.BeginInvoke("Hallo Welt!", 42, Nothing, Nothing)
    8. End Sub
    Mit freundlichen Grüßen,
    Thunderbolt