29/09/12 14:23
hakzc
CODICE DEL FORM CONTROLLO SCHERMO
APREV(FORM PRINCIPALE)
TIMER4 E BUTTON 5
e del button per attivare la connessione
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è?
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