Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 32

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    Se non ti dispiace posto il codice:

    Creo il thread

    codice:
    Private Strt As System.Threading.Thread
    Creo la sub che richiama AccessControl:

    codice:
    Sub thread2()
    
    
            AccessControl()
    
    
        End Sub
    Creo Access Control:

    codice:
     Private Sub AccessControl()
    
    
            If Me.InvokeRequired Then
                Me.Invoke(New MethodInvoker(AddressOf AccessControl))
                IcImagingControl1.LiveStart()
            Else
                'codice che lavora nel thread principale
                cont3 = 1005
    
    
                Dim cont As Integer = 0
                cont6 = 0
    
    
                'ciclo per acquisizione/visualizzazione foto
                While cont <> 50
                    acquisisci(cont)
                    cont = cont + 1
    
    
                End While
                Button3.Visible = True
            End If
        End Sub
    Credo sia qui il problema, perchè alla fine a me basterebbe avere visibile quel tasto (STOP).
    Quindi se lo metto all'inizio della sub mi da lo stesso errore di prima, se lo metto dentro o dopo l'if non me lo rende utilizzabile.

    E questo è il codice in cui viene svolto il lavoro vero e proprio:

    [CODE ]
    Sub acquisisci(ByVal cont As Integer)
    Dim buf As TIS.Imaging.ImageBuffer = GrabImage(TIS.Imaging.MediaSubtypes.RGB32)
    If buf Is Nothing Then Return


    ' RGB32 is bottom-up, the first line has index lines-1
    Dim y As Integer = buf.Lines - 1


    txtOutput.Text = "Image buffer pixel format is RGB32" & vbCrLf
    txtOutput.Text &= "Pixel 1: "
    txtOutput.Text &= "R=" & buf(0 * 4 + 2, y) & ", "
    txtOutput.Text &= "G=" & buf(0 * 4 + 1, y) & ", "
    txtOutput.Text &= "B=" & buf(0 * 4 + 0, y) & vbCrLf
    txtOutput.Text &= "Pixel 2: "
    txtOutput.Text &= "R=" & buf(1 * 4 + 2, y) & ", "
    txtOutput.Text &= "G=" & buf(1 * 4 + 1, y) & ", "
    txtOutput.Text &= "B=" & buf(1 * 4 + 0, y)


    ' Set the first pixel to red (255 0 0)
    buf(0 * 4 + 2, y) = 255
    buf(0 * 4 + 1, y) = 0
    buf(0 * 3 + 0, y) = 0
    ' Set the second pixel to 128 (gray)
    buf(1 * 4 + 2, y) = 0
    buf(1 * 4 + 1, y) = 255
    buf(1 * 4 + 0, y) = 0
    ' Set the third pixel to 255 (white)
    buf(2 * 4 + 2, y) = 0
    buf(2 * 4 + 1, y) = 0
    buf(2 * 4 + 0, y) = 255




    Dim image As New Bitmap(300, 200)
    image = buf.Bitmap
    ' inizio salvataggio immagine tagliata
    'rettangolo per selezione ROI
    Dim Rect As New Rectangle(x1, y1, (x2 - x1), (y3 - y1))


    'creo oggetto bitmap delle dimensioni del rettangono +1px
    Dim bmpTmp = New Bitmap(Rect.Width + 1, Rect.Height + 1)
    Dim grTmp As Graphics = Graphics.FromImage(bmpTmp)
    'taglio immagine
    grTmp.DrawImageUnscaledAndClipped(image, New Rectangle(-Rect.X, -Rect.Y, bmpTmp.Width + Rect.X, bmpTmp.Height + Rect.Y))


    'picturebox in cui inserire immagine tagliata
    Dim picture As New PictureBox()


    Dim myCanvas As Graphics = Graphics.FromImage(bmpTmp)


    'inserisco immagine tagliata all'interno della picturebox
    picture.Image = bmpTmp


    'inserimento prima immagine nell'array
    bitArray(cont6) = bmpTmp




    'inizio unione immagini
    'scalo cont3 (coordinata altezza) ad ogni ciclo
    cont3 = cont3 - 201
    'richiamo immagina (mostra la fetta di immagine nella picturebox finale a destra)
    immagina(cont3, cont6)


    cont4 = 804


    'controlli per la posizione
    If cont3 = 0 Then
    cont3 = 201
    If cont6 = 0 Then
    immagina(cont4, 7)
    immagina(cont4 - 201, 8)
    immagina(cont4 - 402, 9)
    immagina(cont4 - 603, 0)
    ElseIf cont6 = 1 Then
    immagina(cont4, 8)
    immagina(cont4 - 201, 9)
    immagina(cont4 - 402, 0)
    immagina(cont4 - 603, 1)
    ElseIf cont6 = 2 Then
    immagina(cont4, 9)
    immagina(cont4 - 201, 0)
    immagina(cont4 - 402, 1)
    immagina(cont4 - 603, 2)
    Else
    immagina(cont4, cont6 - 3)
    immagina(cont4 - 201, cont6 - 2)
    immagina(cont4 - 402, cont6 - 1)
    immagina(cont4 - 603, cont6)
    End If


    End If
    cont6 = cont6 + 1


    If cont6 = 10 Then
    cont6 = 0
    End If


    End Sub


    'Sub per l'inserimento della foto nella picturebox finale
    'primo parametro indica la coordinata per l'altezza
    'secondo parametro indica l'indice nell'array della nostra foto


    Sub immagina(ByVal cont3, cont2)
    Dim Image2 As Image = bitArray(cont2)
    grTmp2.DrawImage(Image2, New Rectangle(0, cont3, bmpTmp2.Width, 201))


    Dim myCanvas2 As Graphics = Graphics.FromImage(bmpTmp2)
    PictureBox1.Image = bmpTmp2


    End Sub
    [/CODE]

    In ogni caso adesso do un'occhiata a backgroundWorker

  2. #2
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    Se tu potessi rispondere al dubbio di prima te ne sarei grato...
    Adesso ho provato a guardare backgroundWorker.
    Non sembra così difficile, però nel momento in cui lo metto nel codice, quindi aggiungo bgwScan.RunWorkerAsync() e bgwScan.CancelAsync() (giusto per fare due esempi), non riconosce bgwScan.

    Ho seguito la guida di http://www.pierotofy.it/pages/guide/...SystemWatcher/

    Idem quando creo le sub, ad esempio nel DoWork, quando scrivo "... Handles bgwScan.DoWork" mi da errore perchè non riconosce bgwScan.

    Devo dichiararlo da qualche parte???
    Perchè negli esempi che ho visto non viene dichiarato mai...

    AGGIORNAMENTO:
    Ho inserito questo:

    codice:
    Dim bgwScan As BackgroundWorker
    e adesso riconosce bgwScan.

    Il problema però persiste qui:

    codice:
    Private Sub bgwScan_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgwScan.DoWork
    L'errore che mi restituisce è questo:

    Error 3
    Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
    Ultima modifica di SigAlexey; 23-09-2014 a 09:19

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da SigAlexey Visualizza il messaggio
    Se tu potessi rispondere al dubbio di prima te ne sarei grato...
    Adesso ho provato a guardare backgroundWorker.
    Non sembra così difficile, però nel momento in cui lo metto nel codice, quindi aggiungo bgwScan.RunWorkerAsync() e bgwScan.CancelAsync() (giusto per fare due esempi), non riconosce bgwScan.

    Ho seguito la guida di http://www.pierotofy.it/pages/guide/...SystemWatcher/

    codice:
    Dim bgwScan As BackgroundWorker
    Error 3
    Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
    Rispetto all'uso del thread, come nell'articolo.. direi che hai fatto su un po di casino...
    questo pezzo:
    codice:
    If Me.InvokeRequired Then
                Me.Invoke(New MethodInvoker(AddressOf AccessControl)) 
            Else
    Va lasciato così' com'è e non ci va messa nessuna istruzione dentro l'IF condizione VERO. Quel IF li funziona per verificare chi ha eseguito la chiamata a quella sub e nel caso c'è una chiamata ricorsiva.. Vabbè, dettagli tecnici. In ogni caso, nella sub AccessControl devi mettere solo le istruzioni che accedono ai controlli della GUI, quindi quella che modifica la proprietà visible del button. Il ciclo che fa il lavoro va nella sub MyThread1. E l'accessControl va nel ciclo stesso
    Però vista così la cosa, direi che il backgroundWorker è la soluzione migliore.
    Devi dichiarare l'oggetto così:
    codice:
         Dim WithEvents bgwScan As BackgroundWorker
    
    Cioè che genera eventi. Solo così puoi impostare gli Handles di risposta sulle sub.
    Lascia stare la soluzione con più thread generati da te e concentrati sul backgroud, che è fatto apposta per semplificare la casistica come la tua. Hai un ciclo che gira sul suo thread, devi solo gestire l'evento di cancellazione del processo di elaborazione e di stop del ciclo sul thread.

  4. #4
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Cioè che genera eventi. Solo così puoi impostare gli Handles di risposta sulle sub.
    Lascia stare la soluzione con più thread generati da te e concentrati sul backgroud, che è fatto apposta per semplificare la casistica come la tua. Hai un ciclo che gira sul suo thread, devi solo gestire l'evento di cancellazione del processo di elaborazione e di stop del ciclo sul thread.
    Ok, infatti stavo andando in quella direzione.

    Per risolvere il problema degli Handles ho trovato una soluzione: Dalla pagina Design ho aggiunto dalla ToolBox BackgroundWorker.

    E in questo modo riesco ad accedere al programma.

    Ora però mi ridà lo stesso errore iniziale, nel momento in cui premo il tasto che fa partire il salvataggio di tutto.

    Questo è quello che ho fatto:

    DoWork
    codice:
    Private Sub bgwScan_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwScan.DoWork
            'codice che lavora nel thread principale
            cont3 = 1005
    
    
            Dim cont As Integer = 0
            cont6 = 0
    
    
            'ciclo per acquisizione/visualizzazione foto
            While cont <> 50
                acquisisci(cont)
                cont = cont + 1
                'System.Threading.Thread.Sleep(15)
    
    
            End While
            If bgwScan.CancellationPending Then
                e.Cancel = True
            End If
    
    
        End Sub
    Tasto di avvio
    codice:
    Private Sub cmdRGB32_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRGB32.Click
            bgwScan.RunWorkerAsync()
        End Sub
    Tasto di chiusura
    [CODE]
    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    bgwScan.CancelAsync()
    End Sub
    [CODE]

  5. #5
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Cioè che genera eventi. Solo così puoi impostare gli Handles di risposta sulle sub.
    Lascia stare la soluzione con più thread generati da te e concentrati sul backgroud, che è fatto apposta per semplificare la casistica come la tua. Hai un ciclo che gira sul suo thread, devi solo gestire l'evento di cancellazione del processo di elaborazione e di stop del ciclo sul thread.
    Ok, infatti stavo andando in quella direzione.

    Per risolvere il problema degli Handles ho trovato una soluzione: Dalla pagina Design ho aggiunto dalla ToolBox BackgroundWorker.

    E in questo modo riesco ad accedere al programma.

    Ora però mi ridà lo stesso errore iniziale, nel momento in cui premo il tasto che fa partire il salvataggio di tutto.

    Questo è quello che ho fatto:

    DoWork
    codice:
    Private Sub bgwScan_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwScan.DoWork
            'codice che lavora nel thread principale
            cont3 = 1005
    
    
            Dim cont As Integer = 0
            cont6 = 0
    
    
            'ciclo per acquisizione/visualizzazione foto
            While cont <> 50
                acquisisci(cont)
                cont = cont + 1
                'System.Threading.Thread.Sleep(15)
    
    
            End While
            If bgwScan.CancellationPending Then
                e.Cancel = True
            End If
    
    
        End Sub
    Tasto di avvio
    codice:
    Private Sub cmdRGB32_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRGB32.Click
            bgwScan.RunWorkerAsync()
        End Sub
    Tasto di chiusura
    codice:
    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    bgwScan.CancelAsync()
    End Sub
    Facendo così però, nel momento in cui premo il tasto di avvio, mi da l'errore che si presentava all'inizio, ossia "Cross-thread operation not valid: Control 'IcImagingControl1' accessed from a thread other than the thread it was created on..."

    Non so se può essere utile, però nel form ho anche questo "IcImagingControl1", il quale è praticamente una specie di picturebox, che mi fa vedere ciò che vede la telecamera.
    E' una rappresentazione video nello schermo.
    La utilizzo per vedere cosa sto riprendendo.
    Questa parte all'avvio dell'applicazione e nel momento in cui premo il tasto di avvio dell'assunzione e visualizzazione dell'immagine (il ciclo di cui stiamo trattando), la schermata della telecamera diventa nera e appunto mi esce l'errore di prima.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da SigAlexey Visualizza il messaggio
    Ok, infatti stavo andando in quella direzione.

    Per risolvere il problema degli Handles ho trovato una soluzione: Dalla pagina Design ho aggiunto dalla ToolBox BackgroundWorker.

    E in questo modo riesco ad accedere al programma.

    Ora però mi ridà lo stesso errore iniziale, nel momento in cui premo il tasto che fa partire il salvataggio di tutto.

    Questo è quello che ho fatto:

    DoWork
    codice:
    Private Sub bgwScan_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwScan.DoWork
            'codice che lavora nel thread principale
            cont3 = 1005
    
    
            Dim cont As Integer = 0
            cont6 = 0
    
    
            'ciclo per acquisizione/visualizzazione foto
            While cont <> 50
                acquisisci(cont)
                cont = cont + 1
                'System.Threading.Thread.Sleep(15)
    
    
            End While
            If bgwScan.CancellationPending Then
                e.Cancel = True
            End If
    
    
        End Sub
    Tasto di avvio
    codice:
    Private Sub cmdRGB32_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRGB32.Click
            bgwScan.RunWorkerAsync()
        End Sub
    Tasto di chiusura
    codice:
    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    bgwScan.CancelAsync()
    End Sub
    Facendo così però, nel momento in cui premo il tasto di avvio, mi da l'errore che si presentava all'inizio, ossia "Cross-thread operation not valid: Control 'IcImagingControl1' accessed from a thread other than the thread it was created on..."

    Non so se può essere utile, però nel form ho anche questo "IcImagingControl1", il quale è praticamente una specie di picturebox, che mi fa vedere ciò che vede la telecamera.
    E' una rappresentazione video nello schermo.
    La utilizzo per vedere cosa sto riprendendo.
    Questa parte all'avvio dell'applicazione e nel momento in cui premo il tasto di avvio dell'assunzione e visualizzazione dell'immagine (il ciclo di cui stiamo trattando), la schermata della telecamera diventa nera e appunto mi esce l'errore di prima.
    Si. ti da errore perché la picturebox è gestita dalla GUI. Dovresti togliere il controllo dal form (cancellarlo) e istanziarlo come nuovo oggetto all'interno della sub RunWork. Questo fa si che la picturebox diventi un oggetti del thread controllato dal background. Semplicemente lo dichiari come nuovo oggetto.. A te interessa vedere il controllo attivo, o solo elaborare le immagini? Perché l'elaborazione delle immagini la fai all'interno del ciclo e se vuoi notificare qualcosa, lo fai con l'evento reportProgress, nel quale puoi modificare gli oggetti nel form.
    Altra cosa:
    codice:
    bgwScan.CancellationPending
    Va messo dentro il ciclo, cioè ogni a ogni ciclo devi verificare se è richiesto lo stop. Sennò non uscirà mai dal ciclo infinito..

  7. #7
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    CancellationPending ci sono.

    La parte sopra (la più importante D: ) non ancora...
    Mi hai detto di cancellare la PictureBox dalla sezione Design giusto?
    Poi per rimetterla nel posto giusto devo utilizzare dei parametri da codice?

    Comunque a me interessa vedere lo scorrimento delle immagini nella picture box e intanto poter premere il pulsante di stop quando voglio.

    Perchè per ora ho impostato che dopo la cinquantesima immagine si blocchi.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da SigAlexey Visualizza il messaggio
    CancellationPending ci sono.

    La parte sopra (la più importante D: ) non ancora...
    Mi hai detto di cancellare la PictureBox dalla sezione Design giusto?
    Poi per rimetterla nel posto giusto devo utilizzare dei parametri da codice?

    Comunque a me interessa vedere lo scorrimento delle immagini nella picture box e intanto poter premere il pulsante di stop quando voglio.

    Perchè per ora ho impostato che dopo la cinquantesima immagine si blocchi.
    Potresti mettere una picturebox normale nel form mentre l'oggetto che usi per l'acquisizione non lo "disegni" nel form, ma lo instanzi come oggetto nel sub dowork. All'interno del ciclo fai l'acquisizione delle immagini, la loro elaborazione e poi usi l'evento ReportProgress per mostrare l'immagine elaborata nel form.. Così dovrebbe andare, a rigor di logica.

  9. #9
    Utente di HTML.it L'avatar di SigAlexey
    Registrato dal
    May 2014
    residenza
    Treviso
    Messaggi
    186
    Sarò stupido io ma non ci sto capendo più niente

    Non capisco dove devo aggiungere e togliere le cose...

    Mi sa che ci rinuncio...

    Ho cancellato la pictureBox dalla sezione Design e adesso quando premo il tasto funziona (più o meno), però non mi visualizza la pictureBox finale, mi fa laggare quella iniziale in cui si visualizza ciò che riprende la telecamera e infine, seppur avendo messo il CancellationPending dove mi hai detto e abilitando la cancellazione, non si ferma il thread quando premo il tasto (che finalmente ora è abilitato), ma appena finisce il ciclo si blocca tutto...

    Non so più che fare


    E tutto questo casino proprio il giorno del mio compleanno... non ci voleva proprio....

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da SigAlexey Visualizza il messaggio
    Sarò stupido io ma non ci sto capendo più niente

    Non capisco dove devo aggiungere e togliere le cose...

    Mi sa che ci rinuncio...

    Ho cancellato la pictureBox dalla sezione Design e adesso quando premo il tasto funziona (più o meno), però non mi visualizza la pictureBox finale, mi fa laggare quella iniziale in cui si visualizza ciò che riprende la telecamera e infine, seppur avendo messo il CancellationPending dove mi hai detto e abilitando la cancellazione, non si ferma il thread quando premo il tasto (che finalmente ora è abilitato), ma appena finisce il ciclo si blocca tutto...

    Non so più che fare


    E tutto questo casino proprio il giorno del mio compleanno... non ci voleva proprio....
    Beh.. la cosa che stai cercando di fare non è proprio banale.. Quindi è chiaro che ci sono dei passaggi un po complessi e sopratutto un bel bagaglio di conoscenze sulla programmazione.
    Prova intanto a postare qua il codice che hai scritto.

    PS: buon compleanno!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.