Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Backgroundworker e trasferimento tramite socket (client-server multi-connessione): indice oltre i limiti della matrice
Forum - C# / VB.NET - Backgroundworker e trasferimento tramite socket (client-server multi-connessione): indice oltre i limiti della matrice

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 16:23
Sabato, 29/09/2012
CODICE DEL FORM CONTROLLO SCHERMO

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Net.Sockets
  2. Imports System.Text.ASCIIEncoding
  3. Imports System.IO
  4.  
  5. Public Class controllo_schermo
  6.     Dim x As Integer = ApRev.ListView1.SelectedItems(0).SubItems(1).Text
  7.     Dim id As Integer = ApRev.ListView1.SelectedItems(0).SubItems(6).Text
  8.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  9.         sendok()
  10.     End Sub
  11.     Private Sub sendok()
  12.         Dim temp() As Byte = ASCII.GetBytes("startsend")
  13.         ApRev.flusso(x).Write(temp, 0, temp.Length)
  14.         BackgroundWorker1.RunWorkerAsync()
  15.     End Sub
  16.     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  17.         Dim Stream As New IO.FileStream("Z:\Users\Hakzc\Documents\io.gif", IO.FileMode.Create)
  18.         Do
  19.             If ApRev.dskcliente(id).Available Then
  20.                 Dim Bytes(4096) As Byte
  21.          
  22.                 ApRev.dskflusso(id).Read(Bytes, 0, 4096)
  23.                 Stream.Write(Bytes, 0, 4096)
  24.                 System.Threading.Thread.Sleep(10)
  25.                 dim msg As String = ASCII.GetString(Bytes)
  26.                 If msg.Contains("END2") Then
  27.                     Exit Do
  28.                 End If
  29.             End If
  30.         Loop
  31.         BackgroundWorker1.Dispose()
  32.         BackgroundWorker1.CancelAsync()
  33.         Stream.Close()
  34.         PictureBox1.ImageLocation = "Z:\Users\Hakzc\Documents\io.gif"
  35.         sendok()
  36.     End Sub
  37. End Class



APREV(FORM PRINCIPALE)
TIMER4 E BUTTON 5

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
  2.         If dskservitore.Pending() Then
  3.             Timer4.Stop()
  4.             Array.Resize(dskcliente, dskcliente.Length + 1)
  5.             dskcliente(dskcliente.Length - 1) = dskservitore.AcceptTcpClient()
  6.             Array.Resize(dskflusso, dskflusso.Length + 1)
  7.             dskflusso(dskflusso.Length - 1) = dskcliente(dskcliente.Length - 1).GetStream()
  8.             For r = 0 To UBound(dskcliente)
  9.                 ListView1.SelectedItems(0).SubItems(6).Text = r.ToString
  10.             Next
  11.             controllo_schermo.Show()
  12.             Timer4.Start()
  13.         End If
  14.     End Sub



e del button per attivare la connessione

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
  2.         dskservitore = New TcpListener(599)
  3.         dskservitore.Start()
  4.         Timer4.Start()
  5.         Button5.BackColor = Color.Green
  6.     End Sub




Praticamente cliccando sul button5 si apre la connessione e viene avviato il timer4 che controlla le connessioni in entrata, successivamente cliccando su un altro bottone (che non ho messo perchè non serve) il client attraverso un altro flusso dati/porta invia un messaggio al server, così il server si connette e quando il client riceve la richiesta di connessione la accetta ed apre controllo schermo.
Cliccando sul bottone presente sul form controllo schermo il client invia un messaggio (dalla porta principale, non dalla porta del trasferimento immagini) al server dicendo di iniziare ad inviare le immagini ed apre backgroundworker, il server conteporaneamente prende uno screen dello schermo, lo salva e lo invia a pacchetti tramite timer, ricevuto lo screen il form controllo schermo dovrebbe farlo apparire sulla picturebox e poi inviare una nuova richiesta per la ricezione di un nuovo screen.

Il punto è che se uso i timer in entrambi i lati è apposto e funziona (però spostando l'applicazione client va a scatti a spostarsi e per premere un button ci mette 3 secondi) se provo con un backgroundworker nel client mi dice indice oltre i limiti della matrice su questo pezzo di codice: If ApRev.dskcliente(id).Available Then
premetto che l'array non è vuota, e funziona tutto con i timer. Lo stesso errore anche se metto in entrambi i lati i backgroundworker. Perchè?

Ultima modifica effettuata da hakzc il 29/09/2012 alle 16:24
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:43
Sabato, 29/09/2012
Ma quando hai l'errore quanto vale id ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 18:45
Sabato, 29/09/2012
il valore è 0, ed è giusto xke con i timer funziona e ricevo le immagini

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:03
Sabato, 29/09/2012
Il valore è 0 e quindi deve esistere almeno un elemento di quell'array. Ma se non viene eseguito prima il Resize dell'array allora avrai l'errore.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 19:06
Sabato, 29/09/2012
ma il resize viene eseguito in precedenza dal timer che gestisce le connessioni in entrata

PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 19:10
Sabato, 29/09/2012
ma il 0 è il primo elemento dell'array, e poi con i timer funziona, comunque anche se connetto due volte il server così da avere 1 mi da lo stesso errore

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:10
Sabato, 29/09/2012
Evidentemente il thread in background parte prima di quando arriva il Timer.

Ricorda che la programmazione multithread è complessa perché devi pensare al fatto che diverse parti di codice lavorino "in parallelo" e devi prevedere una certa "sincronizzazione" tra loro.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
hakzc (Normal User)
Rookie


Messaggi: 37
Iscritto: 07/07/2012

Segnala al moderatore
Postato alle 19:12
Sabato, 29/09/2012
praticamente l'id viene assegnato prima di aprire il form contenente il backgroundworker

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:28
Sabato, 29/09/2012
Per l'esattezza il backgroundworker parte prima che il resize venga eseguito.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo