Ik ben de hele dag al bezig om tot een goede oplossing te komen voor mijn probleem, echter lukt het nog niet erg. Eerst een korte situatieschets
Ik heb een wachtrij waarin objecten worden opgeslagen. De wachtrij moet één voor één de objecten doorsturen naar een functie, dit gebeurt dmv een event. Er kunnen handlers worden toegevoegd aan de wachtrij welke een object doorkrijgen.
De verwerking van deze objecten kan echter flink oplopen, ik wil niet dat de rest van de applicatie dan bevriest, dus wil ik de queue in een aparte thread draaien. Dit lukt tot zover ook nog wel. Echter wil ik de listview (gekoppeld aan de queue) updaten. Omdat form elementen en andere threads niet zo lekker gaan, wil ik dit dus doen vanuit het main-formulier (getriggerd door een event vanuit de queue).
Globaal ziet de code er zo uit:
De lijst wordt wel geupdate wanneer ik op de Button1 clickt.
Nu wil ik eigenlijk het volgende doen:
Echter schijnt dit een probleem te geven met multithreading, terwijl ik verwacht dat de handler toch direct in het formulier staat (en dus de 'mainthread' aanspreekt).
Ik ben nog niet zo heel ver met vb (ben opgegroeid met php, maar daar kom je zulke dingen niet tegen).
Ik heb een wachtrij waarin objecten worden opgeslagen. De wachtrij moet één voor één de objecten doorsturen naar een functie, dit gebeurt dmv een event. Er kunnen handlers worden toegevoegd aan de wachtrij welke een object doorkrijgen.
De verwerking van deze objecten kan echter flink oplopen, ik wil niet dat de rest van de applicatie dan bevriest, dus wil ik de queue in een aparte thread draaien. Dit lukt tot zover ook nog wel. Echter wil ik de listview (gekoppeld aan de queue) updaten. Omdat form elementen en andere threads niet zo lekker gaan, wil ik dit dus doen vanuit het main-formulier (getriggerd door een event vanuit de queue).
Globaal ziet de code er zo uit:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| ' The queuelist is used to keep items in an certain order, those items can be processed by a passed function Public Class Queue ' Variable to keep the queue, the last item is the one that should be processed last Private arrItems As New ArrayList ' Keep the object to view the status in here Private oListStatus As ListView ' Property(s) to show in the list Private arrViewProperties As ArrayList Public Event Evt_NextItem(ByVal item As Object) Public Event Evt_UpdateList() Public Event Evt_Completed() ' Add an object to the end of the queue, if the object isn't in the queue already ' Author: M. Winkel ' Date: 2008-03-26 Public Sub addItem(ByVal newitem As Object) ' voeg een item toe End Sub Public Sub run() ' Only start a new process if there's nothing in process If Me.strInProcess Is Nothing And Me.arrItems.Count > 0 Then RaiseEvent Evt_NextItem(processObject) Me.arrItems.RemoveAt(0) Me.strInProcess = Nothing RaiseEvent Evt_UpdateList() Me.run() Else RaiseEvent Evt_Completed() End If End Sub Public Sub updateList() ' update the mainform listview, referenced by me.oListStatus End Sub End Class ' oQueue is een object in de form: Private WithEvents oQueue As Queue Dim t As Threading.Thread t = New Threading.Thread(AddressOf Me.oQueue.run) t.Start() ' Gebruik de volgende methodes in het form: Public Sub showMessage(ByVal obj As Object) Handles oQueue.Evt_NextItem MsgBox("Some message is send 1") End Sub Public Sub showMessage2() Handles oQueue.Evt_UpdateList MsgBox("Some message is send 2 UpdateList") End Sub Public Sub showMessage3() Handles oQueue.Evt_Completed MsgBox("Some message is send 3 Completed") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.oQueue.updateList() End Sub |
De lijst wordt wel geupdate wanneer ik op de Button1 clickt.
Nu wil ik eigenlijk het volgende doen:
Visual Basic .NET:
1
2
3
4
5
6
| Public Sub showMessage2() Handles oQueue.Evt_UpdateList MsgBox("Some message is send 2 UpdateList") Me.oQueuelist.updateList() End Sub |
Echter schijnt dit een probleem te geven met multithreading, terwijl ik verwacht dat de handler toch direct in het formulier staat (en dus de 'mainthread' aanspreekt).
Ik ben nog niet zo heel ver met vb (ben opgegroeid met php, maar daar kom je zulke dingen niet tegen).
"Chaos kan niet uit de hand lopen"