Oppure

Loading
29/09/12 14:23
hakzc
CODICE DEL FORM CONTROLLO SCHERMO

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

    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

   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 29/09/12 14:24
aaa
29/09/12 16:43
nessuno
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à.
29/09/12 16:45
hakzc
il valore è 0, ed è giusto xke con i timer funziona e ricevo le immagini
aaa
29/09/12 17:03
nessuno
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à.
29/09/12 17:06
hakzc
ma il resize viene eseguito in precedenza dal timer che gestisce le connessioni in entrata
aaa
29/09/12 17:10
hakzc
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
aaa
29/09/12 17:10
nessuno
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à.
29/09/12 17:12
hakzc
praticamente l'id viene assegnato prima di aprire il form contenente il backgroundworker
aaa