Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Errore: L'oggetto è correntemente utilizzato altrove.
Forum - C# / VB.NET - Errore: L'oggetto è correntemente utilizzato altrove.

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 14:49
Martedì, 26/01/2010
Salve a Tutti sto cercandi di fare un programmino che mi anilizza un immagine
ho fatto una classe che ha il compito di trovare tutti gli oggetti o aree in un immagine
e uso un thread  dichiaro le immagini a livello di classe però mi da errore come da titolo
quando la nodifico posto un po di codice


Codice sorgente - presumibilmente VB.NET

  1. Public Function Area(ByVal P As Point, ByVal img As Bitmap, ByVal Coefficente As Integer) As List(Of Point)
  2.         'P punto dove hai cliccato col secchiello
  3.         'B è la bitmap In questione
  4.         Dim Points As New List(Of Point)
  5.         Dim NewPoints As New List(Of Point)
  6.         Dim ColoreAttuale As Color = Nothing
  7.         Dim ColoreOggetto As Color = img.GetPixel(P.X, P.Y)
  8.         Dim ArrayPoint As New List(Of Point)
  9.  
  10.         Points.Add(P)
  11.         Do
  12.  
  13.             Try
  14.                 For Each K As Point In Points
  15.                     Dim J As Point
  16.                     Dim d As Point
  17.                     Dim s As Point
  18.                     Dim Sot As Point
  19.                     'testa il punto a destra di questo
  20.                     If K.X > 0 Then
  21.                         J = New Point(K.X - 1, K.Y)
  22.                     Else
  23.                         J = New Point(K.X, K.Y)
  24.                     End If
  25.  
  26.                     ColoreAttuale = img.GetPixel(J.X, J.Y)
  27.                     If IsNearestColor(ColoreOggetto, ColoreAttuale, Coefficente) = True Then 'Funzione Di Confronto Colore con coefficente
  28.                         If PuntiInseriti.IndexOf(J) = -1 Then
  29.                             immagineRed.SetPixel(J.X, J.Y, Color.Red)' immagine appartenente alla classe che da errore
  30.                             NewPoints.Add(J)
  31.                             PuntiInseriti.Add(J)
  32.                             ArrayPoint.Add(J)
  33.                         End If
  34.                     End If
  35.                     If d.X < img.Width - 1 Then
  36.                         d = New Point(K.X + 1, K.Y)
  37.                     End If
  38.  
  39.                     ColoreAttuale = img.GetPixel(d.X, d.Y)
  40.                     Dim si As String = ColoreAttuale.ToString
  41.                     If IsNearestColor(ColoreOggetto, ColoreAttuale, Coefficente) = True Then
  42.                         If PuntiInseriti.IndexOf(d) = -1 Then
  43.                             immagineRed.SetPixel(d.X, d.Y, Color.Red)' immagine appartenente alla classe che da errore
  44.                             NewPoints.Add(d)
  45.                             PuntiInseriti.Add(d)
  46.                             ArrayPoint.Add(d)
  47.                         End If
  48.                     End If
  49.                     If K.Y > 0 Then
  50.                         s = New Point(K.X, K.Y - 1)
  51.                     End If
  52.  
  53.                     ColoreAttuale = img.GetPixel(s.X, s.Y)
  54.                     If IsNearestColor(ColoreOggetto, ColoreAttuale, Coefficente) = True Then
  55.                         If PuntiInseriti.IndexOf(s) = -1 Then
  56.                             immagineRed.SetPixel(s.X, s.Y, Color.Red)' immagine appartenente alla classe che da errore
  57.                             NewPoints.Add(s)
  58.                             PuntiInseriti.Add(s)
  59.                             ArrayPoint.Add(s)
  60.                         End If
  61.                     End If
  62.  
  63.                     If Sot.Y < img.Height - 2 Then
  64.                         Sot = New Point(K.X, K.Y + 1)
  65.                     Else
  66.  
  67.                     End If
  68.                     If Sot.Y < img.Height Then
  69.                         ColoreAttuale = img.GetPixel(Sot.X, Sot.Y)
  70.                         If IsNearestColor(ColoreOggetto, ColoreAttuale, Coefficente) = True Then
  71.  
  72.                             If PuntiInseriti.IndexOf(Sot) = -1 Then
  73.                                 immagineRed.SetPixel(Sot.X, Sot.Y, Color.Red)' immagine appartenente alla classe che da errore
  74.                                 NewPoints.Add(Sot)
  75.                                 PuntiInseriti.Add(Sot)
  76.                                 ArrayPoint.Add(Sot)
  77.  
  78.                             End If
  79.                         End If
  80.                     End If
  81.                 Next
  82.             Catch ex As Exception
  83.                 MsgBox("Area: " & ex.Message & vbCrLf & ex.StackTrace)
  84.             End Try
  85.  
  86.             Points.Clear()
  87.             Points.AddRange(NewPoints)
  88.             NewPoints.Clear()
  89.  
  90.         Loop Until Points.Count = 0
  91.         immagineRed = img
  92.         Return ArrayPoint
  93.  
  94.     End Function


non riesco proprio a capire perche fa quell'errore vi ringrazio tanto dell'aiuto:-?

Ultima modifica effettuata da Il Totem il 27/01/2010 alle 10:03
PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 19:21
Martedì, 26/01/2010
ho scoperto che sensa thread lerrore non si presenta ma essendo un processo al quanto lungo devo usare per forsa un thread
nessuno mi puo aiutare ?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:08
Mercoledì, 27/01/2010
Se l'oggetto immagine è lo stesso per entrambi i thread, puoi fare due cose. Rendere la variabile img Thread-Static (ossia unica per ogni thread), applicandole l'attributo ThreadStatic: in questo caso, però, img deve essere dichiara Shared.
La seconda soluzione consiste nel clonare l'oggetto prima di usarlo, in modo che i due thread utilizzino dati identici ma diversi (nel senso che non si riferiscono allo stesso oggetto). img.Clone() restituisce il clone di img. Se usi questo metodo, devi aggiungere un parametro alla tua funzione che indichi su quale immagine lavorare...

PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 12:01
Mercoledì, 27/01/2010
Totem ti ringrazio  :hail:
il  problema che ora ma da un tipo diverso di errore ho provato ad usare clone e Shared ma
con clone mi da questo errore: "bitmap già bloccata."
cosa so sbaliando?
Con Shared devo dichiarare la variabile in un  modulo? o nella classe del form ?

PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 12:30
Mercoledì, 27/01/2010
io ho fatto cosi ho clonato limmagine passando il clone dell'immagine alla funzione è giusto ?
cosa intendi per aggiungere un parametro che indichi su quale immagine lavorare?

PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 12:32
Mercoledì, 27/01/2010
se passo un clone alla funzione con dei parametri byval non sono due oggetti distinti?

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:33
Sabato, 30/01/2010
Tra parentesi, gli oggetti vengono sempre passati per indirizzo, anche con byval (proprio perchè sono oggetti, gestiti tramite puntatori).
E sì, se crei due oggetti diversi non può darti errore per "oggetto già bloccato", perchè i due SONO a tutti gli effetti due istanze completamente distinte. Hai richiamato la funzione due volte con i parametri diversi? Ad esempio:
Codice sorgente - presumibilmente Plain Text

  1. funzione(..., img)
  2. funzione(..., img.clone)


PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 20:18
Giovedì, 11/02/2010
Inanzitutto Grazie
In pratica si richiamo la funzione (Area)  in un ciclo  che scorre tutti i pixel dell'immagine quando trova il colore diverso dallo sfondo invio la solita immagine modificata ed ogni volta assegnata al controllo tramite delegato, la funzione area ricerca tutti i pixel apparteneti al solito oggetto cioè attaccati, ho anche provato a lavorare in memoria con (System.Runtime.InteropServices.Marshal.Copy) ma non ho otenuto grandi risultati
la funzione che richiama (Area) è:

    Sub Parser()
        If immagine Is Nothing Then
            Exit Sub
        End If
        Dim Larghezza As Integer = immagine.Width - 1 'Larghezza
        Dim Altezza As Integer = immagine.Height - 1 'Altezza
        Dim x As Integer
        Dim y As Integer
        Dim ColoreAttuale As Color

        ' GDI+ still lies to us - the return format is BGR, NOT RGB.
        Dim bmData As BitmapData = Immagine.LockBits(New Rectangle(0, 0, Immagine.Width, Immagine.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)

        Dim stride As Integer = bmData.Stride
        Dim Scan0 As System.IntPtr = bmData.Scan0
        Dim bytes As Integer = Immagine.Width * Immagine.Height * 3
        Dim p(bytes - 1) As Byte
        ' Copy the RGB values into the array.
        System.Runtime.InteropServices.Marshal.Copy(Scan0, p, 0, bytes)


        'finire da qui e lavorare su p variabile puntatore di area di memoria

        If Funzione = Funzioni.TrovaOggettiDiUnColore Then
            If _coloreSfondo = Nothing Then
                MsgBox("Per La funzione di ricerca degli oggetti Di un Colore bisogna selezionare pripa il colore da catturare")
                Exit Sub
            End If
        Else 'Se Gli oggetti sono di piu colori iposto il colore di sfondo
            ' e inposto la variabile boleana a false cosi che ogni colore diverso lo considera un oggettto
            'Trova_Escludi = False
            If _coloreSfondo = Nothing Then
                _coloreSfondo = Color.FromArgb(p(0), p(1), p(2)) '
            End If
        End If
        immagineRed = DirectCast(Immagine.Clone, Bitmap)


        Dim c As Integer = 0
        Dim nOffset As Integer = stride - bmData.Width * 3


        For y = 0 To Altezza
            For x = 0 To Larghezza
                'Debug.Assert(Control.InvokeRequired = False)
                If y = 42 Then
                    Threading.Thread.Sleep(10)
                End If
                'ColoreAttuale = Immagine.GetPixel(x, y)
                ColoreAttuale = Color.FromArgb(p(c + 2), p(c + 1), p(c))
                'Application.DoEvents()

                If PuntiInseriti.IndexOf(c) = -1 Then
                    If IsNearestColor(_coloreSfondo, ColoreAttuale, CoefficenteSfondo) = False Then 'Funzione Di Confronto Colore con coefficente
                        Application.DoEvents()
                        Oggetto = New OggettiImmagine
                        Oggetto.coefficente = CoefficenteOggetto
                        Oggetto.colore = ColoreAttuale
                        Oggetto.point = Area(c, immagineRed.Clone, CoefficenteOggetto)
                        If Oggetto.point.Count > PuntiPerPallino Then
                            _Oggetti.Add(Oggetto)
                        End If
                        If Control IsNot Nothing Then
                            SetImage(Red_Imagine, Control)
                        End If

                    End If
                End If
                c += 3
            Next
            c += nOffset
        Next

        Immagine.UnlockBits(bmData)

    End Sub

PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 20:24
Giovedì, 11/02/2010
Ok ma è possibile che sia il delegato che fà confusione?
In pratica modificavo l'immagine poi la asegnavo al controllo tramite delegato Ho provato a non aggiornare il controllo e l'errore non me lo da più
Come posso fare a vedere i progressi che il programma sta facendo?
se metto un thread.sleep posso risolvere il problema?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo