Thread Parameterübergabe

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Thread Parameterübergabe

    Hi Leute,

    ich stehe hier vor einem kleinen Problem. Ich will einen Thread starten, der halt läuft und in ein Panel etwas zeichnet, ohne dass das Programm hängt.
    Der Thread wird im Panel1.paint Event ausgelöst und ich würde mit dem Starten des Threads gerne die PaintEventArgs weitergeben.

    Ist das möglich oder muss ich eine andere Möglichkeit finden?

    Ich danke für jede sinnvolle Antwort

    MFG
    Timon
    Auf der Suche nach Coding-Kursen auf Lence.at

    KingTimon schrieb:

    eine andere Möglichkeit finden?
    Du kannst der Thread-Prozedur ein Object als Parameter übergeben.
    Wenn Du im Thread in Deiner Form malen willst, wird das nicht gehen, Du müsstest wieder Invoken.
    Stell also im Thread die erforderlichen Daten bereit, und wenn der Thread beendet ist, rufst Du in einem entsprechenden Event die GUI auf, dass sie sich neu zeichnen möge.
    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!

    VB.NET-Quellcode

    1. Private Sub Panel1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
    2. If MyTabControl1.SelectedIndex = 1 Then
    3. Dim newthread As System.Threading.Thread
    4. newthread = New System.Threading.Thread(AddressOf Me.LoadScreenies)
    5. newthread.Start() 'Vorgang starten
    6. Control.CheckForIllegalCrossThreadCalls = False
    7. End If
    8. End Sub
    9. Sub LoadScreenies(e As System.Windows.Forms.PaintEventArgs)
    10. Dim Path1 As String = ("C:\Users\" & SystemInformation.UserName & "\AppData\Roaming\.minecraft\screenshots")
    11. Dim height As Integer = 10
    12. TabPage2.Refresh()
    13. With e.Graphics
    14. For Each item As String In My.Computer.FileSystem.GetFiles(Path1)
    15. Dim i As Image = Image.FromFile(item)
    16. Dim Rect As New Rectangle(10, height, i.Width / 10, i.Height / 10)
    17. .DrawImage(i, Rect)
    18. height = height + 10 + i.Height / 10
    19. Next
    20. Panel1.AutoScrollMinSize = New Size(0, height)
    21. .Dispose()
    22. Panel1.Dispose()
    23. End With
    24. End Sub

    Das ist mein bisheriger Code. Wie meinst du kann ich das Objekt übergeben?
    Auf der Suche nach Coding-Kursen auf Lence.at

    KingTimon schrieb:

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False
    Solch Ranz solltest Du ganz schnell vergessen.
    Was genau willst Du denn im Paint darstellen, und was nicht?
    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!
    Wie man hier sieht will ich alle Screenshots des Computers im Panel1 zeichnen, und zwar untereinander. Das dauert ziemlich lange bei vielen Screenshots und es hängt sich auf, wenn ich das direkt ins PaintEvent mach. Deswegen der Thread.

    Ich weiß dass mein Programmierstile nicht der Beste ist, will aber noch lernen.

    MFG
    Auf der Suche nach Coding-Kursen auf Lence.at

    KingTimon schrieb:

    und zwar untereinander.
    Wie soll das aussehen?
    Sind immer alle gleichzeitig zu sehen?
    Hat es Zweck, da ein Control zum Blättern vorzusehen?
    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!
    Hmm ein Control zum Blättern, gute Idee!

    Ich denke da werd ich mich gleich ransetzen :D
    Auf der Suche nach Coding-Kursen auf Lence.at
    Bin so gut wie fertig mit dem Control

    Hätte mal ne Frage: Wie würdet ihr alle Screenshots in eine List(of Bitmap) adden?

    Wenn ichs so mache:

    VB.NET-Quellcode

    1. For Each item As String In My.Computer.FileSystem.GetFiles(ImagePath, FileIO.SearchOption.SearchAllSubDirectories)
    2. Images.Add(Image.FromFile(item))
    3. Next


    kommt leider ein Fehler zur Laufzeit, obwohl ich den Ordner richtig angegeben habe.

    An was könnte das liegen?
    Auf der Suche nach Coding-Kursen auf Lence.at
    Dein Problem ist, dass du im PaintEventHandler mehr machst als zu zeichnen. Zeichnen geht relativ schnell, aber das Laen deiner Bilder haut die Performance um. Lade die Bilder einmalig, und halte sie in einer List(Of) fest, un greife beim Zeichnen nur daruaf zu.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Hi,

    Danke für deine Antwort. Diesen Code hier wird nur einmalig ausgelöst. Trotzdem funkts nicht wirklich...


    Unter der Laufzeit kommt folgender Fehler:

    System.NullReferenceException: Der Objektverweis wurde nicht auf einer Objetkinstanz festgeleg.

    Bis jetzt bin ich draufgekommen dass es an diesen Befehlen liegt:

    VB.NET-Quellcode

    1. ​Images.Clear()

    VB.NET-Quellcode

    1. ​Images.Add(item)


    Images ist eine Liste, erstellt mit

    VB.NET-Quellcode

    1. Dim Images As List(Of String)

    Auf der Suche nach Coding-Kursen auf Lence.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „KingTimon“ ()

    Images ist wahrscheinlich Nothing. Initialisiere diese Variable mal mit New.

    Was anderes: Threading würde ich mit dem Action-Delegat und dessen BeginInvoke-Methode lösen. Das ist nämlich eine typisierte Parameterübergabe in den Thread und wird nicht alles nach Object und wieder zurück.

    C#-Quellcode

    1. new Action<int>((i) => {
    2. Console.WriteLine("Parameter: {0}", i);
    3. }).BeginInvoke(42, null, null);
    Mit freundlichen Grüßen,
    Thunderbolt
    Thunderbold wow danke. Hat geklappt!

    Da sieht man mal was ein einfaches "New" ausmachen kann ;)
    Auf der Suche nach Coding-Kursen auf Lence.at
    Das sehe ich aners. Jedes mal, wenn das Control neugezeichent werden muss, wird das PaintEvent aufgerufen. Dieses abbonierst du, und dann wird immer deine Methoed aufgerufen.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Hi @'ErfinderDesRades

    Erstmal danke für deine Antwort, die hab ich leider, muss ich zugeben, übersehen.

    Habe mein Control jetzt schon fertig, und bin stolz, so etwas FAST alleine gemacht habe. Ihr habt mir wieder toll geholfen, hab mir nicht so viel Beteiligung im Thread erwartet!

    MFG
    KingTimon
    Auf der Suche nach Coding-Kursen auf Lence.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KingTimon“ ()

    Hi,

    Hab da noch eine Frage. Das Control ist schon fertig, nur hab ich mich mit einigen unschönen umwegen geholfen. Das Bild wird als eigene Picturebox ins Control gezeichnet, damit ich den Sizemode Zoom machen kann. Ich würd das ganze jetzt gerne trotzdem gleich aufs Control zeichnen lassen, da ich das wirklich ungern als Ausweg verwenden möchte.

    Meine Frage an euch: Weiß jemand den Weg zu berechnen, wie groß das Bild (Verhältnis Größe, Breite einhalten) maximal sein kann.

    MFG
    KingTimon
    Auf der Suche nach Coding-Kursen auf Lence.at

    KingTimon schrieb:

    den Weg zu berechnen
    Du kannst das Bild skaliert darstellen. Sieh Dir mal die Überladungen von Graphics.DrawImage() an.
    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!