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 :
nella form principale invece ho piazzato all'evento LOADcodice: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
ok ... e' poco preciso , ma per il mio uso va molto benecodice: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
e poi la funzione richiamata :
la funzione joystick rileva quale tasto e' stato premuto e richiama una funzione del programmacodice:#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
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

Rispondi quotando