vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Von irgendeinen Thread auf Listbox zugreifen 
Autor: Seek1
Datum: 07.03.18 15:18

Hallo Leute,

Ich werde mit dieem Multithreading nochmals verrückt.
Was ich will:
Von egal einem Sub,Thread usw. einen Eintrag in eine Listbox schreiben.
Die Funktion zum Schreiben sollte in einem Modul liegen.

In der Mainform funktioniert es folgendermassen:
    Private Delegate Sub WriteStatusDelegate(ByVal msg As String)
 
    Public Sub WriteStatus(ByVal msg As String)
        If Me.InvokeRequired Then
            Me.Invoke(New WriteStatusDelegate(AddressOf WriteStatus), msg)
        Else
            lst_Messages.Items.Add(DateAndTime.Now.ToString & ": " & msg)
            lst_Messages.SelectedIndex = lst_Messages.Items.Count - 1
            lst_Messages.Refresh()
        End If
    End Sub
Aber wie funktioniert das in einem Modul?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: Manfred X
Datum: 07.03.18 16:17

Hallo!

Das solltest Du etwas genauer erklären.
Von einem Modul greift man gewöhnlich nicht
direkt auf ein UI-Control zu, sondern arbeitet
mit einer Klasse und einem Event.

Aber ......

Public Class frmThreading
 
    Dim lbo As New ListBox With {.Parent = Me, .Top = 40}
 
    Dim WithEvents btn As New Button With {.Parent = Me}
 
 
    Private Sub btn_Click(sender As Object, e As EventArgs) _
        Handles btn.Click
 
        Writer.Lbo = lbo
        Dim th As New Threading.Thread _
            (New Threading.ThreadStart(AddressOf Writer.writesomething))
        th.Start()
    End Sub
 
End Class
 
 
Public Module Writer
 
    Public Property Lbo As ListBox
 
 
    Public Sub writesomething()
 
        Lbo.Invoke(New MethodInvoker(AddressOf DoWrite))
 
    End Sub
 
 
    Private Sub dowrite()
 
        Lbo.Items.Add(Now.ToString)
 
    End Sub
 
End Module


Beitrag wurde zuletzt am 07.03.18 um 16:18:15 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: sv00010
Datum: 07.03.18 19:02

Den Delegaten nicht als Private deklarieren, sondern besserals public.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: Kuno60
Datum: 07.03.18 21:54

Hallo,
zum Beispiel so:
 Private Delegate Sub WriteStatusDelegate(ByVal msg As String)
 
Public Sub WriteStatus(ByVal msg As String)
    With Mainform
        If .InvokeRequired Then
            .Invoke(New WriteStatusDelegate(AddressOf WriteStatus), msg)
        Else
            .lst_Messages.Items.Add(DateAndTime.Now.ToString & ": " & msg)
            .lst_Messages.SelectedIndex = lst_Messages.Items.Count - 1
            .lst_Messages.Refresh()
        End If
    End With
End Sub
oder die Mainform als Argument übergeben:
 Private Delegate Sub WriteStatusDelegate(ByVal msg As String)
 
Public Sub WriteStatus(ByVal f as Form, ByVal msg As String)
    If f.InvokeRequired Then
        f.Invoke(New WriteStatusDelegate(AddressOf WriteStatus), msg)
    Else
        f.lst_Messages.Items.Add(DateAndTime.Now.ToString & ": " & msg)
        f.lst_Messages.SelectedIndex = lst_Messages.Items.Count - 1
        f.lst_Messages.Refresh()
    End If
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: Seek1
Datum: 09.03.18 11:28

Habe mal folgendes in ein Modul verfrachtet:

    Public Delegate Sub WriteStatusDelegate(ByVal msg As String)
 
    Public Sub WriteStatus(ByVal msg As String)
        With frm_Main
            If .InvokeRequired Then
                .Invoke(New WriteStatusDelegate(AddressOf WriteStatus), msg)
            Else
                .lst_Messages.Items.Add(DateAndTime.Now.ToString & ": " & msg)
                .lst_Messages.SelectedIndex = .lst_Messages.Items.Count - 1
                .lst_Messages.Refresh()
            End If
        End With
    End Sub
Leider wird das ".invokeRequired" nicht ausgelöst :-/

Wenn ich es in die frm_main packe, funktioniert es.

Auch nicht, wenn ich "frm_main.invokeRequired" benutze
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: effeff
Datum: 09.03.18 16:34

Du musst dann auch schon die richtige Instanz der frm_Main angeben...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: Seek1
Datum: 09.03.18 16:52

Wie mach ich das?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: effeff
Datum: 10.03.18 14:59

Also... Hier ist mal ein Beispiel, wie man eine Instanz der ListBox an eine Variable in einem Modul übergibt sowie den in die ListBox einzutragenden Text; Auf einer Form befindet sich eine Listbox mit dem Namen "ListBox1" und ein Button. Der Code dazu sieht so aus:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
      Button1.Click
 
        modThread.lstBox = Me.ListBox1
        modThread.Text = Now
 
        Dim myThread As New System.Threading.Thread(AddressOf _
          modThread.UpdateList)
        myThread.Start()
 
    End Sub
End Class
Das Modul dazu sieht so aus:

Public Delegate Sub ListBoxUpdate(ByVal Text As String)
 
Module modThread
 
    Private _lstBox As ListBox
    Private _Text As String
 
    Public Property lstBox As ListBox
        Get
            Return _lstBox
        End Get
        Set(value As ListBox)
            _lstBox = value
        End Set
    End Property
 
    Public Property Text As String
        Get
            Return _Text
        End Get
        Set(value As String)
            _Text = value
        End Set
    End Property
 
    Public Sub UpdateList()
        If _lstBox.InvokeRequired Then
            _lstBox.Invoke(New ListBoxUpdate(AddressOf UpdateList), _Text)
        Else
            _lstBox.Items.Add(_Text)
        End If
    End Sub
 
End Module

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: Seek1
Datum: 13.03.18 08:06

OK. Das habe ich jetzt kapiert.
Also müsste ich jedesmal Me.ListBox1 mitgeben

Habe das jetzt über ein Workaround gelöst:
Es gibt eine Public Shared String Variable.
In die wird der Eintrag geschrieben.
Ein Timer überprüft auf <> "" und trägt bei Bedarf den Text ein.

Aber dankeschön.
Habe da wieder einiges dazugelernt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Von irgendeinen Thread auf Listbox zugreifen 
Autor: effeff
Datum: 13.03.18 14:17

//Habe da wieder einiges dazugelernt.//

Nein, hast Du anscheinend nicht...

Was passiert, wenn Deine Daten schneller in die Variable geschrieben werden, als dass Dein Timer die Daten überträgt? Dann gehen Dir Daten flöten, weil Daten vor der Übertragung bereits wieder überschrieben werden; Das gleiche wird passieren, wenn ein Wert in die Variable geschrieben wird und das Programm geschlossen wird, bevor der Variableninhalt in die ListBox eingetragen wird...

Die Angabe für die ListBox brauchst Du nur einmal zu machen und greifst dann immer wieder darauf zu. Dazu ist die Property im Modul da.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel