
hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
CODICE DEL FORM CONTROLLO SCHERMO
Codice sorgente - presumibilmente VB.NET |
Imports System.Net.Sockets Imports System.Text.ASCIIEncoding Imports System.IO Public Class controllo_schermo Dim x As Integer = ApRev.ListView1.SelectedItems(0).SubItems(1).Text Dim id As Integer = ApRev.ListView1.SelectedItems(0).SubItems(6).Text Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click sendok() End Sub Private Sub sendok() Dim temp() As Byte = ASCII.GetBytes("startsend") ApRev.flusso(x).Write(temp, 0, temp.Length) BackgroundWorker1.RunWorkerAsync() End Sub Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim Stream As New IO.FileStream("Z:\Users\Hakzc\Documents\io.gif", IO.FileMode.Create) Do If ApRev.dskcliente(id).Available Then Dim Bytes(4096) As Byte ApRev.dskflusso(id).Read(Bytes, 0, 4096) Stream.Write(Bytes, 0, 4096) System.Threading.Thread.Sleep(10) dim msg As String = ASCII.GetString(Bytes) If msg.Contains("END2") Then Exit Do End If End If Loop BackgroundWorker1.Dispose() BackgroundWorker1.CancelAsync() Stream.Close() PictureBox1.ImageLocation = "Z:\Users\Hakzc\Documents\io.gif" sendok() End Sub End Class
|
APREV(FORM PRINCIPALE)
TIMER4 E BUTTON 5
Codice sorgente - presumibilmente VB.NET |
Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick If dskservitore.Pending() Then Timer4.Stop() Array.Resize(dskcliente, dskcliente.Length + 1) dskcliente(dskcliente.Length - 1) = dskservitore.AcceptTcpClient() Array.Resize(dskflusso, dskflusso.Length + 1) dskflusso(dskflusso.Length - 1) = dskcliente(dskcliente.Length - 1).GetStream() For r = 0 To UBound(dskcliente) ListView1.SelectedItems(0).SubItems(6).Text = r.ToString Next controllo_schermo.Show() Timer4.Start() End If End Sub
|
e del button per attivare la connessione
Codice sorgente - presumibilmente VB.NET |
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click dskservitore = New TcpListener(599) dskservitore.Start() Timer4.Start() Button5.BackColor = Color.Green 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 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6345
Iscritto: 03/01/2010
|
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à. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
il valore è 0, ed è giusto xke con i timer funziona e ricevo le immagini
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6345
Iscritto: 03/01/2010
|
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à. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
ma il resize viene eseguito in precedenza dal timer che gestisce le connessioni in entrata
|
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/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
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6345
Iscritto: 03/01/2010
|
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à. |
|

hakzc (Normal User)
Rookie
    
Messaggi: 37
Iscritto: 07/07/2012
|
praticamente l'id viene assegnato prima di aprire il form contenente il backgroundworker
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6345
Iscritto: 03/01/2010
|
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à. |
|