Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    50

    [vb.net] MIDI: problema con i delegate : errore di callback dopo garbage collection

    spero di non aver scritto cavolate nel titolo ,
    purtroppo mi ritrovo con un problema di concetto , essendo passato io da poco a vb.net non ho capito ancora bene come funziona il concetto di delegate ed in generale il concetto di programmazione ad oggetti ( essendo io passato da programmazione ad eventi! ).

    Iniziero' a leggere una guida avanzata ( sto leggendo quella di pierotofy , perche' quella di questo sito e' alquanto ristretta )

    Pero' ... ho poco tempo , prima di rimettermi a studiare per l'universita' dovrei finire il programma, alla svelta ,quindi vi spiego il problema .

    Ho trovato del codice in vb6 per utilizzare il mio controller midi per i miei soft .
    aiutandomi con degli esempi presi su internet sono riuscito a farlo girare benone su vb.net utilizzando il metodo delegate ... da completo profano . Pero' c'e' un problema , la funzione richiamata dai delegate funziona solo se richiama a sua volta delle sub che caricano poco la cpu , quindi , a volte mi da' l'errore a volte no , sull 'help ho trovato esposta la causa e la soluzione , pero' essendo io alquanto profano in materia , in realta' non ho capito bene ne la causa ne la soluzione , il link e' questo : LINK

    ora vi incollo il codice che fa funzionare il mio controller midi come joystick

    in un modulo ho messo :



    codice:
    Module Module1
    
        Declare Function midiInGetNumDevs Lib "winmm.dll" () As Long
        Declare Function midiInGetDevCaps Lib "winmm.dll" Alias "midiInGetDevCapsA" (ByVal uDeviceID As Integer, ByRef lpCaps As MIDIINCAPS, ByVal uSize As Integer) As Integer
    
        'Api:
        Public Delegate Function Memorize_EventCallback(ByVal MidiInHandle As Integer, _
                                                   ByVal Message As Integer, _
                                                   ByVal Instance As Integer, _
                                                   ByVal dw1 As Integer, _
                                                   ByVal dw2 As Integer) As Integer
    
        Declare Function midiInOpen Lib "winmm.dll" (ByRef lphMidiIn As Integer, ByVal uDeviceID As Integer, ByVal dwCallback As Memorize_EventCallback, ByVal dwInstance As Integer, ByVal dwFlags As Integer) As Integer
    
        Declare Function midiInClose Lib "winmm.dll" (ByVal hMidiIn As Integer) As Integer
        Declare Function midiInStart Lib "winmm.dll" (ByVal hMidiIn As Integer) As Integer
        Declare Function midiInStop Lib "winmm.dll" (ByVal hMidiIn As Integer) As Integer
        Declare Function midiInReset Lib "winmm.dll" (ByVal hMidiIn As Integer) As Integer
    
        'la reference
        Public ri As Long
    
        Public Structure MIDIINCAPS
            Dim wMid As Short ' Manufacturer ID
            Dim wPid As Short ' Product ID
            Dim vDriverVersion As Integer ' Driver version
            Dim szPname As String ' Product Name
            Dim dwSupport As Integer ' Supported extras
        End Structure
    
        Public Const CALLBACK_FUNCTION = &H30000    'riferimento alla funzione
    
    End Module
    nella form principale invece ho piazzato all'evento LOAD



    codice:
            Dim a As Integer
            a = midiInGetNumDevs
                ListBox1.Items.Add("controller midi :" & a)
            If a = 1 Then
                midiInOpen(ri, 0, AddressOf MidiIn_Event, 0, CALLBACK_FUNCTION)
                midiInStart(ri)
                ListBox1.BackColor = Color.GreenYellow
            ElseIf a = 0 Then
                MsgBox("controller midi non connesso oppure piu di un controller connesso!")
                ListBox1.BackColor = Color.LightCoral
            End If
    ok ... e' poco preciso , ma per il mio uso va molto bene

    e poi la funzione richiamata :



    codice:
     
    
    #Region "regione RICEVIMIDI"
    
        Public Function MidiIn_Event(ByVal MidiInHandle As Integer, ByVal Message As Integer, ByVal Instance As Integer, ByVal dw1 As Integer, ByVal dw2 As Integer) As Integer
            Dim a As String, b As String, c As String
            Dim out As Short
            If dw1 > 255 Then
                Call RiceviMidi(dw1)
            End If
        End Function
    
    
        Private Delegate Sub midiDelegate(ByVal code As Integer)
    
        Public Sub RiceviMidi(ByVal code As Integer)
            If Me.InvokeRequired Then
                Me.Invoke(New midiDelegate(AddressOf RiceviMidi), New Object() {code})
                Return
            End If
            Dim b As String, a As String, c As String
            a = code.ToString
            b = Strings.Left(Strings.Right("00000000" + Hex(a), 6), 4)
            c = Int("&H" + Strings.Right(b, 2))
                    Call Joystick(c)
            End If
        End Sub
    
    #End Region
    la funzione joystick rileva quale tasto e' stato premuto e richiama una funzione del programma
    ecco ... se la funzione e' molto breve , diciamo processata in meno di 100ms non da errore ,
    altrimenti mi arriva un errore di tipo CallbackOnCollectedDelegate .


    potreste darmi una mano a risolvere il problema ??

    grazie 1000

  2. #2
    Non ho capito gran che' del sistema in se', ma quel genere di errore di solito si verifica quando chiami un oggetto che è già stato chiuso/distrutto o è "in fase di".

    Prova a controllare che non si verifichi questa condizione

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    50
    esatto , ma non so come fare!

    allora il problema e' che dopo aver eseguito una serie di funzioni molto lunghe , richiamate in joystick , alla prima pressione del tasto tutto ok
    , esegue le funzioni senza errori ,

    quando pero' fatto questo vado a premere un tasto qualsiasi della tastiera midi ( uno qualsiasi , non per forza quello assegnato per eseguire altre funzioni ) , che richiama la funzione delegate di callback ( e0 giusto? ) , questa e' stata chiusa (? non so' perche') e mi appare l'errore in questione .

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.