Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[vb.NET] Events en multithreading

Pagina: 1
Acties:

  • storeman
  • Registratie: April 2004
  • Laatst online: 19-11 11:29
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:

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"


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Doe even zoeken op ISynchronizeInvoke. Deze issue is al verschillende malen voorbij gekomen op dit forum.

If it isn't broken, fix it until it is..


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Bekijk even de links in \[C#]Events, Threads en delegates
(Waar ook Niemand_Anders in reageerde). Staat een hoop interessant leesvoer in.

[ Voor 5% gewijzigd door TeeDee op 27-03-2008 16:25 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • storeman
  • Registratie: April 2004
  • Laatst online: 19-11 11:29
Ah, ik zocht op vb.net, kwam deze niet direct tegen. Zal er eens aandachtig naar kijken

"Chaos kan niet uit de hand lopen"


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je je Queue niet gewoon een soort Observable maken ( Dus met iets van een Changed Event ). In je Form of Control waar je list dan wil updaten kan je iets als het volgende neerzetten

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public Form()
{
    ...
    queue.Changed += Queue_Changed;
}

private void Queue_Changed( object sender, EventArgs e )
{
    if( InvokeRequired )
    {
        Invoke( (EventHandler)Queue_Changed, new object{} { sender, e } ) ;
        return;
    }
    UpdateList();
}

private void UpdateList()
{
    ...
}


Het lijkt me immers dat je niet al te veel GUI logica in je Queue wil hebben.

[ Voor 10% gewijzigd door Woy op 27-03-2008 16:47 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

storeman schreef op donderdag 27 maart 2008 @ 16:30:
Ah, ik zocht op vb.net, kwam deze niet direct tegen. Zal er eens aandachtig naar kijken
C# wordt vaker in artikelen, tutorials en forums gebruikt dan VB.net. Dit heeft deels te maken dat de syntaxis van C# veel overeenkomsten heeft met andere talen. Visual Basic heeft daarnaast (helaas) nog steeds het labeltje dat dit voornamelijk voor beginners is. Dat komt vooral door de virtuele legacy welke het meedraagt uit Visual Basic 1 t/m 6. Tegenwoordig is VB.NET even krachtig als C#, maar toch wordt het minder gebruikt.

Een andere reden dat VB.net minder wordt gebruikt komt omdat veel development bedrijven in 2002 (.NET Support in Visual Studio 2002, daarvoor werd voornamelijk Visual InterDev gebruikt) hun asp naar asp.net converteerde door vbscript om te zetten naar vb.net code. Daarbij werden totaal de .net development principes vergeten, waardoor de performance over het algemeen slecht was..

Kortom, heb je ene probleem in VB.net en kun je niet direct een antwoord vinden, doe dan een zoekopdracht naar C#. De Verschillen tussen C# en VB.net zijn vrij klein dat als je de code rustig leest, je deze wel kunt 'porten'.

De zoekoptocht op C# ipv VB voorkomt ook dat je VB6 constructies terug krijgt.

If it isn't broken, fix it until it is..


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Vreemde naam Queue hier, ook omdat er al een van .NET is: Queue. Ook die recursie ipv while zie ik niet helemaal.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • storeman
  • Registratie: April 2004
  • Laatst online: 19-11 11:29
rwb schreef op donderdag 27 maart 2008 @ 16:38:
Kan je je Queue niet gewoon een soort Observable maken ( Dus met iets van een Changed Event ). In je Form of Control waar je list dan wil updaten kan je iets als het volgende neerzetten
Zoiets ben ik al mee bezig, excuses als dit niet helemaal duidelijk is uit het voorbeeld.
Niemand_Anders schreef op donderdag 27 maart 2008 @ 16:49:
[...]

C# wordt vaker in artikelen, tutorials en forums gebruikt dan VB.net. Dit heeft deels te maken dat de syntaxis van C# veel overeenkomsten heeft met andere talen. Visual Basic heeft daarnaast (helaas) nog steeds het labeltje dat dit voornamelijk voor beginners is. Dat komt vooral door de virtuele legacy welke het meedraagt uit Visual Basic 1 t/m 6. Tegenwoordig is VB.NET even krachtig als C#, maar toch wordt het minder gebruikt.

etc...
Ja, porten is wel te doen, en wat betreft de VB6 code, dat wil je inderdaad niet.
pedorus schreef op donderdag 27 maart 2008 @ 17:13:
Vreemde naam Queue hier, ook omdat er al een van .NET is: Queue. Ook die recursie ipv while zie ik niet helemaal.
De queue heeft een andere namespace, dus dat lijkt me niet zo'n probleem.

Die recursie is inderdaad niet logisch, ik ga daar eens een loop van maken, zal net zo mooi werken.

"Chaos kan niet uit de hand lopen"

Pagina: 1