Multithreading & datagridviewscrollbar problemen

Status
Niet open voor verdere reacties.

mastermindzh

Verenigingslid
Lid geworden
10 dec 2008
Berichten
4.993
voor probleem 2 maak ik een andere vraag.

Probleem 2:

HTML:
extra info:
"query" is een dim die bovenaan de app staat, deze wordt ALTIJD eerst ingevuld voordat de thread start.
control.checkforillegalcrossthreadcals staat op true
system.threading is geimporteerd
loading is een picturebox met een foto zodat gebruikers weten dat het programma bezig is

Omdat het ophalen van gegevens uit een database nogal lang kan duren (veel gegevens), wil ik dit proces multithreading meegeven.

Dat doe ik nu op de volgende manier

[CPP] Dim tryquerythread = New System.Threading.Thread(AddressOf tryquery)

Public Sub tryquery()

Try
loading.Visible = True
Dim adapter As New MySqlDataAdapter()
adapter.SelectCommand = New MySqlCommand(query, myconn)
Dim mydatatable As New DataTable
adapter.Fill(mydatatable)
DataGridView1.DataSource = mydatatable
DataGridView1.ScrollBars = ScrollBars.Both

txtQuery.Text = query
loading.Visible = False
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
[/CPP]

vervolgens roep ik dit op deze manier aan:

[CPP]
query = "Select * from werkuren"

Try
tryquerythread.isbackground = True
tryquerythread.Start()
Catch ex As Exception
MsgBox(ex.Message)
End Try
[/CPP]

Ook heb ik dit geprobeert:

[CPP]
query = "Select * from werkuren"

Try
tryquerythread = New System.Threading.Thread(AddressOf tryquery)
tryquerythread.isbackground = True
tryquerythread.Start()
Catch ex As Exception
MsgBox(ex.Message)
End Try
[/CPP]

en ook deze variant heb ik geprobeert:

[CPP] query = "Select * from werkuren"

Private Sub ToolStripMenuItem130_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem130.Click
query = "Select * from werkuren"
Try
tryquerythread.cancel()
Catch ex As Exception

End Try
Try
tryquerythread = New System.Threading.Thread(AddressOf tryquery)
tryquerythread.isbackground = True
tryquerythread.Start()
Catch ex As Exception
MsgBox(ex.Message)
End Try

End Sub
[/CPP]

Alle 3 de varianten lijken hetzelfde resultaat te geven, namelijk het volgende:

1ste keer drukken op de knop: query voert uit (alles gaat goed op scrollbars na, zie probleem 1)
2de keer drukken op de knop: query voert uit (alles gaat goed op scrollbars na, zie probleem 1)
3de keer drukken op de knop: NullreferenceException was unhandled

Soms triggert het ook bij de 2de keer en soms bij de 8ste etc... (ik heb het idee dat ik dan te snel weer het knopje indruk, en dus zal moeten controleren of de thread bezig is)

Kan iemand hier mee helpen?

[edit]
ook een isnot nothing wrap helpt niet
[cpp] If tryquerythread IsNot Nothing Then[/cpp]
[/edit]
 
Laatst bewerkt:
Hoi,

Om te kijken of de thread nog 'aanstaat' kan je dit gebruiken:
[CPP]If Not Thr.IsAlive Then
''//Nieuwe starten
Else
''//Is nog bezig
End If[/CPP]

Je moet dan wel zorgen dat ook de eerste keer de thread niet niks is.

Succes!
MartinJM
 
Dat resulteert in dezelfde nullreferenceexception
nullref.png



En dat is met code:

[CPP]

If Not tryquerythread.isalive Then
tryquerythread = New System.Threading.Thread(AddressOf tryquery)
tryquerythread.start()
Else
tryquerythread.cancel()
tryquerythread = New System.Threading.Thread(AddressOf tryquery)
tryquerythread.start()
End If

[/CPP]


PS: enig idee waarom de scrollbars zo lastig doen :P?
 
Laatst bewerkt:
Ik heb geen idee waarom de scrollbars niet werken... Maar je moet zorgen dat je de thread bij het starten al maakt:
[CPP]dim thr as new system.threading.thread(addressof thrsub)[/CPP]
(even uit de losse pols vanaf mijn telefoon)

MartinJM
 
Dat wordt gedaan zodra ik het form oproep, het voor de code zetten werkt echter ook niet.

ps: kijken of de thread alive is doet niks, ofwel hij geeft steeds false terug (waardoor hij nooit in de else komt)


code voor de voledigheid:

[cpp]

Private Sub ToolStripMenuItem130_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem130.Click
runtryquerythread("select * from werkuren")
End Sub

Private Sub runtryquerythread(ByRef query2 As String)
query = query2

If tryquerythread.IsAlive Then
MsgBox("Nog bezig")
Else
Try
tryquerythread.Start()
Catch ex As Exception
MsgBox(ex.Message)
End Try

End If

End Sub

[/cpp]


[edit]
Een simpele try catch vangt de thread af, en geeft terug of deze bezig is.
Nu probeer ik hem te stoppen en opnieuw te starten, maar ik zit weer met hetzelfde probleem....
eerste 2-3x doet hij het, daarna stopt hij.

[cpp] Private Sub runtryquerythread(ByRef query2 As String)
query = query2

If tryquerythread.IsAlive Then
MsgBox("Nog bezig")
Else
Try
tryquerythread.Start()
Catch ex As Exception
tryquerythread.abort()
tryquerythread = New System.Threading.Thread(AddressOf tryquery)
tryquerythread.start()
End Try

End If

End Sub [/cpp]

[/edit]
 
Laatst bewerkt:
Klein snel voorbeeldje:
[CPP]Public Class Form1

Private Thr As New System.Threading.Thread(AddressOf NewThread)
Delegate Sub SetTextCallback(ByVal [text] As String)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not Thr.IsAlive Then
Thr = New System.Threading.Thread(AddressOf NewThread)
Thr.Start()
Else
MsgBox("Thread is still alive")
End If
End Sub

Private Sub NewThread()
Me.SetText("Thread is alive")

System.Threading.Thread.Sleep(5000)

Me.SetText("Thread is not alive")
End Sub

Private Sub SetText(ByVal [text] As String)
If Me.Label1.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
Else
Me.Label1.Text = [text]
End If
End Sub
End Class
[/CPP]

Dit bedoelde ik. Bij mij werkt het. Ik heb het vaker geprobeerd...
Als je deze code probeert (in een ander leeg project), werkt het dan wel?

MartinJM
 
Ik had het al opgelost gisternacht :), geen zin meer om te posten.



Wat ik heb gedaan:

nieuwe class met de code die uitgevoerd moet worden :), en die wilde wel meteen multithreading pakken :P

Bedankt nog voor het meedenken ! en fijne jaarswisseling!
 
Schijn bedriegt :P

Het leek zo even te werken, maar nu faalt het weer.
Wel weet ik nu (per toeval) waar het aan licht!

Ik gebruik om te testen een gratis cloud mysql host, en die heeft een limiet. Elke keer als ik 3-4 nieuwe threads starte (boven op de al bestaande thread + mijn phpmyadmin venster), krijg ik de melding(in het admin panel van de gratis host "Too many connections, you can upgrade to PRO to get unlimited connections! ".

Bij toeval wilde ik mijn tv aanzetten (en sprong mij 2de tv, die ik als monitor gebruik, ook aan (2x samsung...)) en daar zag ik het database management center.

Al met al dus vreselijk stom :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan