Avatar billede wired Nybegynder
14. august 2004 - 21:12 Der er 1 kommentar og
1 løsning

Thread and DataGrid

Programmet skal sende et tal fra en client til denne server, når der trykkes på en knap. Dette virker hvis jeg nøjes med at bruge en ListBox, men ikke hvis jeg vil have det over i et DataGrid?
Er der nogen der kender en løsning på dette problem?

Her er koden, det som er markeret med *** er det som får programmet til at gå ned når det har modtaget 100 tal fra clienten, samtidig gør det også det at der kommer to scrollbarene i datagrid'en en gang i mellem. Button2 tilføjer også data til datagriden på samme måde (bare fra serveren) uden at det går galt:


  Friend WithEvents TimeData As Listen ' Prepare for the event-handler
  Friend DT As System.Data.DataTable
  Friend DS As System.Data.DataSet

  Public Nr As Integer = 1
  Class Listen
    Public Event TimeDataReady(ByVal data As String)
    Public Sub WaitForConnectAndAccept()
      Dim server As TcpListener = New TcpListener(IPAddress.Any, 1234)
      server.Start()
      Dim client As TcpClient = server.AcceptTcpClient
      Dim rdr As StreamReader = New StreamReader client.GetStream)
      Dim line As String = rdr.ReadLine
      rdr.Close()
      client.Close()
      server.Stop()
      RaiseEvent TimeDataReady(line)
    End Sub
  End Class

  Function CreateDataTable(ByVal TableName As String) As DataTable...

Sub ReceivedTime(ByVal data As String) Handles TimeData.TimeDataReady
    ListBox1.Items.Add(Nr)
'*************************************
'*  Dim DR As DataRow = DT.NewRow
'*  DR("kommentar") = Nr
'*  DT.Rows.Add(DR)
'*************************************

    Nr = Nr + 1

    TimeData = New Listen
    Call (New Thread(New ThreadStart(AddressOf TimeData.WaitForConnectAndAccept))).Start()
  End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    DT = CreateDataTable("AllData")
    DS = New DataSet("regi")
    DS.Tables.Add(DT)
    DataGrid1.SetDataBinding(DS, "AllData")
    TimeData = New Listen
    Call (New Thread(New ThreadStart(AddressOf TimeData.WaitForConnectAndAccept))).Start()
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    ListBox1.Items.Add(Nr)
    Dim DR As DataRow = DT.NewRow
    DR("kommentar") = Nr
    Nr = Nr + 1
    DT.Rows.Add(DR)
  End Sub

  Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    Application.Exit()
    Environment.Exit(0)
  End Sub

Jeg troede jeg havde styr på det man det er svært at finde en fejl som først opstår efter 100 forsendelser. Jeg vil formode at det har noget med en stack at gøre (el. lign.) men kan ikke se fejlen.
Avatar billede wired Nybegynder
14. august 2004 - 21:21 #1
Jeg bør nok nævne at programmet fungere således at det starter en tråd, som venter på at modtage en streng fra clienten (dette virker).
  Dim client As TcpClient = server.AcceptTcpClient
Når den har modtaget strengen rejser den eventen TimeDataReady og afslutter tråden:
  RaiseEvent TimeDataReady(line)
ReceivedTime reagere på eventen og tilføjer et nr (burde være data, men er nr i test-eksemplet) til Listbox1'en

og til DataTabellen, som ligger i et Dataset, der er bundet til Datagrid'en.
(Udmasker jeg dette opstår der ingen fejl).

Herefter startes tråden igen og der ventes på ny efter data fra clienten.
(fidusen er at man i mellemtiden han rette i de modtaget data i datagrid'en)
Avatar billede wired Nybegynder
25. august 2004 - 22:14 #2
Løsningen var at anvende invoke i tråden:
Me.BeginInvoke(CallDataBindToDataGrid)
Og derefter starte tråden igen i CallDataBindToDataGrid
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester