Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6

    Backgroundworker e socket: indice oltre i limiti della matrice

    CODICE DEL FORM CONTROLLO SCHERMO

    Codice sorgente - presumibilmente VB.NET
    codice:
    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
    codice:
    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
    codice:
    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
    Il programma è una specie di desktop remoto(x scopi legali credetemi),

    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è? Ho provato ad inserire il backgroundworker sul form principale (aprev) e funziona e riceve le immagini, come mai allora sul form controllo_schermo con lo stesso codice mi dice indice oltre i limiti della matrice?
    (l'array non è vuota)

    Il backgroundworker deve perforza essere sul form controllo_schrmo (secondario)

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    L'array non ha nessun elemento quando il thread viene eseguito.

    Come ti è stato indicato in

    http://www.pierotofy.it/pages/extras...id=&id=1041787
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

  4. #4

    Moderazione

    Mancava il tag del linguaggio nel titolo e i tag [code] per formattare il codice; ora correggo io, in futuro ricordatene da te (e, come ti è stato detto, dai un'occhiata al regolamento prima di proseguire).



    P.S.: perché "probabilmente" VB.NET?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: Moderazione

    Originariamente inviato da MItaly
    P.S.: perché "probabilmente" VB.NET?
    Perché l'ha copiato pari pari da pierotofy dove appare quella frase ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    e che mi consigli di fare?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Se usi i thread, non ha senso usare i Timer. Devi riscrivere tutto secondo le regole imposte dalla programmazione "multithreading". Ma il discorso diventa complicato, sicuramente non si può rispondere correggendo il tuo codice qui in una risposta del forum ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    lo so ma il punto per-cui ho fatto questa domanda è che mi dice con backgroundworker indice oltre i limiti della matrice è l'array NON e vuota

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ti avevo già scritto

    L'array non ha nessun elemento quando il thread viene eseguito.

    perché la resize avviene nel Timer che parte dopo ...

    Mi dispiace ripetermi ma se chiedi sempre la stessa cosa ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    6
    ma se il timer del resize è nel form1
    nn ho ancora capito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.