threadübergreifender Vorgang

  • VB.NET

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

    threadübergreifender Vorgang

    hi,

    hab mal wieder ein Problem & keine Lösung...

    VB.NET-Quellcode

    1. Public pic1 As String
    2. Public pic2 As String

    VB.NET-Quellcode

    1. Public Sub change_loc(ByVal caption1 As String, ByVal caption2 As String)
    2. pic1 = caption1
    3. pic2 = caption2
    4. End Sub
    5. Public Delegate Sub ChangeVar1(ByVal caption1 As String, ByVal caption2 As String)
    6. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    7. If fi.Length = fi2.Length Then
    8. Me.Invoke(New ChangeVar1(AddressOf change_loc), fi.FullName, fi2.FullName)
    9. Form2.ShowDialog()
    10. End If
    11. End Sub


    ich habe mal den "knackpunkt" ausgeschnitten
    ich möchte 2 Variablen ändern und dann an form2 "übergeben"
    Aufrufen tue ich die Variablen mit "form1.pic1"
    wenn ich die variablen nach "me.invoke" ausgeben lasse, sind sie geändert
    doch wenn form2 sie aufruft, kommt eine Fehlermeldung "ArgumentNullExeption"

    hoffe jmd weiß warum es nicht funktioniert

    mfg
    Das liegt daran, dass du die Form falsch aufrufst. Eine Form muss wie jede andere Klasse auch instanziert werden, um sie zu benutzen. Leider stellt VB ein Feature zur Verfügung, welches zu Abwärtskompatibilität beitragen soll und es ermöglicht, Forms auch ohne Instanzierung aufzurufen. Allerdings treten dann genau diese Fehler auf, da die jeweilige Instanz nur für den Thread gilt, in dem sie erstellt wurde.
    Für genauere Informationen siehe diesen Thread.
    @Artentus: Es liegt nicht am falschen Forms-Aufruf.
    @EngelEatos: Deine Programmphilosophie scheint mir etwas daneben.
    Kannst Du bitte mal erläutern, was Du wie machen willst (Aufgabe des Programms)
    und
    was Du von wo nach wo übertragen willst (Datentransfer)?
    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:

    Es liegt nicht am falschen Forms-Aufruf.
    Ich glaub aber doch. Wie @Artentus: sagt: Im Nebenthread wird ein neue DefaultForm-Instanz erstellt, die natürlich von den hier geänderten Variablen pic1, pic2 nichts weiß.
    Das typische Default-Form-Desaster, was erst dann desaströs zutage tritt, wennman mit Threads anfängt. VeryBasics

    Aber auch die Philosophie ist fragwürdig, so wie da von einem Form ins annere gegrabscht wird...

    ErfinderDesRades schrieb:

    Ich glaub aber doch.
    Ich denke, @EngelEatos: sollte mal etwas mehr Code posten, damit wir das nachvollziehen können.
    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. Dim i As Integer = 0
    2. delCount = 0
    3. ListBox2.DisplayMember = "name"
    4. While i <= ListBox1.Items.Count - 1
    5. ListBox1.SelectedIndex = i
    6. Dim fi As IO.FileInfo = CType(ListBox1.SelectedItem, IO.FileInfo)
    7. For Each fi2 As IO.FileInfo In Me.ListBox2.Items
    8. If Not fi.FullName = fi2.FullName Then
    9. If fi.Length = fi2.Length Then
    10. Me.Invoke(New ChangeVar1(AddressOf change_loc), fi.FullName, fi2.FullName)
    11. End If
    12. End If
    13. Next
    14. i = (i + 1)
    15. End While


    ich lese bilder in zwei Listboxen ein in form von Fileinfos
    diese sollen verglichen werden, sprich die Dateigröße
    wenn übereinstimmungen gefunden worden sind, sollen die in form2 angezeigt werden,
    in form von Pictureboxen
    => pic1 & pic2 sind die Dateipfade die an form2 weitergebe

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

    EngelEatos schrieb:

    VB.NET-Quellcode

    1. i = (i + 1)
    ==> i += 1
    Ich sehe keine Parameterübergabe an den Dialog.
    Gib diesem doch einfach entsprechende Properties.
    Warum zeigst Du bei jeder Übereinstimmung einen modalen Dialog an, den Du wegklicken musst?
    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!
    in form2 rufe ich die variablen mit form1.pic1 auf

    Da ich die Bilder nur auf Dateigröße prüfe^^

    ich will ja doppelte finden & diese löschen, da aber 2 unterschiedliche dateien zufälliger dieselbe Dateigröße haben können, muss ich entscheiden ob es dasselbe ist oder nicht.

    wie übergebe ich Parameter/Properties?

    //habe den code korrigiert

    EngelEatos schrieb:

    ich will ja doppelte finden & diese löschen
    Da gibt es bereits Threads zu. Such mal nach doppelt finden oder so.
    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!
    Entweder, Du erstellst in der KLASSE Form2 einen eigenen Konstruktor und übergibst die Werte beim Instanzieren. Du gibst der KLASSE From2 öffentliche Properties, die Du entsprechend befüllst. Du gibst der KLASSE Form2 eine entsrpechende Funktion/Sub, die Deine Werte entgegennimmt und damit arbeitet. Kommt auf die jeweiligen Anforderungen an. Das geht aus Deinem Code leider nicht klar hervor.

    Das Wort KLASSE ist mit Absicht gross geschrieben. Vielleicht nimmst Du Dir den Link von Rod nochmal vor, da Du den anscheinend nicht verstanden hast, sonst würdest Du nicht fragen.

    vb-paradise.de/allgemeines/tip…-und-aufruf-von-dialogen/
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @EngelEatos: Möglicherweise wirfst Du hieer 2 Sachverhalte in einen Topf:
    1. die Übergabe von Werten an einen Dialog
    2. den threadübergreifenden Vorgang bei der Anzeige von Werten.
    Mach Dir im Dialod eine Sub Add(Wert As String) oder so
    und
    in dieser Sub im Dialog invokest Du die Anzeige.
    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!
    ich sehe noch ühaupt keinen Bedarf für Threading.
    Um FileInfos vom Dateisystem abzurufen braucht man keinen Nebenthread
    Und Dateinamen anzeigen geht garnet in einem Nebenthread - es geht nicht!

    ( wie in Keine Strings in die File-Listbox! übrigens gezeigt)

    also ein Problem nachm anneren lösen
    1. BindingList(Of FileInfo) befüllen
    2. BindingList(Of FileInfo) anzeigen - nur die Dateinamen
    3. Doubletten entfernen
    4. sonstige Verarbeitung, wie auf Klick hin löschen oder als Bild einlesen
    5. ...
    6. Threading nur, wenns Proggi definitiv laggt.