| |
VB.NET - Ein- und UmsteigerVon 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? | |
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. | |
Re: Von irgendeinen Thread auf Listbox zugreifen | | | Autor: sv00010 | Datum: 07.03.18 19:02 |
| Den Delegaten nicht als Private deklarieren, sondern besserals public. | |
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 | |
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 | |
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 | |
Re: Von irgendeinen Thread auf Listbox zugreifen | | | Autor: Seek1 | Datum: 09.03.18 16:52 |
| Wie mach ich das? | |
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 | |
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. | |
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 | |
| 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 |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
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
|
|