Comment faire une boucle par délegation ?

Résolu
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 2 nov. 2010 à 14:58
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 3 nov. 2010 à 16:29
Bonjour,

voici le ptit code que j'me construit et je sèche sur cette histoire de délégation qui n'existait pas en VB6 !

#Region "MUSIC"
    Private bPLAY As Boolean = False
    Private bLOOP As Boolean = False
    Dim myMusic As Audio = Nothing
    Dim myMusicLoop As System.ComponentModel.EventHandlerList

    Private Sub MusicEndsLoop(ByVal sender As Object, ByVal e As System.EventArgs)
        myMusic.CurrentPosition = 0
    End Sub

    Public Sub PlayMusic(ByVal fSoundMedia As String)
        Dim d As System.Delegate

        If bPLAY = False Then
            myMusic = New Audio(fSoundMedia, True)
            myMusic.Play()
            bPLAY = True
            If bLOOP = True Then
                myMusicLoop.AddHandler(myMusic.Stopped, ?)
            Else
                myMusicLoop.RemoveHandler(myMusic.Stopped, ?)
            End If
        Else
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            bPLAY = False
        End If
    End Sub
#End Region


MERCI D'AVANCE !

14 réponses

Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 21:47
C BON, SA FONCTIONNE BIEN, MERCI POUR L'AIDE Duke49 !

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                SOUND_FONCTIONS.SoundFile = fSoundMedia
                cls_audio.myThread = New System.Threading.Thread(AddressOf SOUND_FONCTIONS.PlayMusic)
                cls_audio.myThread = myThread
                cls_audio.myThread.Priority = Threading.ThreadPriority.BelowNormal
                cls_audio.myThread.Start()
            Else
                bPLAYING = False
                SOUND_FONCTIONS.StopMusic()
            End If
        End Sub
        Shared Property MusicLoop()
            Get
                MusicLoop = SOUND_FONCTIONS.StartLoop
            End Get
            Set(ByVal value)
                SOUND_FONCTIONS.StartLoop = value
            End Set
        End Property
        Shared Sub Close()
            System.Threading.Thread.Sleep(250)
            SOUND_FONCTIONS.StopMusic()
        End Sub
    End Class
#End Region

#Region "CLASS SOUND_FONCTIONS"
    Private Class SOUND_FONCTIONS
        Friend Shared SoundFile As String, StartLoop As Boolean
        Shared myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing

        Shared Sub PlayMusic()
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(SoundFile, False)
            myMusic.Play()
            While myMusic.Playing True And bPLAYING True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop True And bPLAYING True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            bPLAYING = False
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
3
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 15:18
En fesant:
myMusicLoop.AddHandler(myMusic.Stopped, AddressOf MusicEndsLoop)

j'obtient:
Erreur 6 L'expression 'AddressOf' ne peut pas être convertie en 'System.Delegate', car le type 'System.Delegate' est déclaré 'MustInherit' et ne peut pas être créé.
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 16:16
J'ai maintenant une erreur sur:
myMusic = New Audio(fSoundMedia, True)


here:
La DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll' tente une exécution managée dans le verrou du chargeur du système d'exploitation. N'essayez pas d'exécuter du code managé dans une fonction d'initialisation d'image ou DllMain, car cela risque d'entraîner un blocage de l'application.
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 16:18
J'en suis arrivé ici (pour info):

Imports Microsoft.DirectX
Imports Microsoft.DirectX.AudioVideoPlayback

Public Class cls_audio
#Region "CLASS MUSIC"
    Public bPLAY As Boolean = False
    Private bLOOP As Boolean = False
    Dim myMusic As Audio = Nothing

    Private Function MusicEndsLoop() As Boolean
        MusicEndsLoop = True
        While bLOOP = True
            If myMusic.Stopped = True Then
                StopMusic()
                Exit While
            End If
            System.Threading.Thread.Sleep(500)
        End While
        MusicEndsLoop = False
    End Function
    Public Sub StopMusic()
        myMusic.Stop()
        myMusic.Dispose()
        myMusic = Nothing
        bPLAY = False
        bLOOP = False
    End Sub
    Public Sub PlayMusic(ByVal fSoundMedia As String, Optional ByVal bLOOP As Boolean = False)
        If bPLAY = False Then
gtLOOP:
            myMusic = New Audio(fSoundMedia, True)
            myMusic.Play()
            bPLAY = True
            If myMusic.Playing = True Then
                If MusicEndsLoop() = True Then GoTo gtLOOP
            End If
        Else
            StopMusic()
        End If
    End Sub
#End Region
End Class
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 16:46
C'est suicidant de voir l'entre aide en .net :(
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 16:48
ou est mon renfield du vb6 :(
SNIF !
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 17:31
J'me rapproche de mon objectif !
(toujours ce méssage d'erreur de DLL LoaderLock sinon sa commence a être bon)

Imports Microsoft.DirectX

Public Class cls_audio

#Region "CLASS MUSIC"
    Public bPLAY As Boolean = False
    Friend bLOOP As Boolean = False
    Protected myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing
    Dim myThread As New System.Threading.Thread(AddressOf MusicEndsLoop)

    Private Sub MusicEndsLoop()
        While myMusic.Playing = True
            If bPLAY False And bLOOP False Then Exit While
            If myMusic.CurrentPosition = myMusic.Duration Then
                If bLOOP = True Then
                    myMusic.StopWhenReady()
                    myMusic.CurrentPosition = 0
                    myMusic.Play()
                Else
                    StopMusic()
                    Exit While
                End If
            End If
            System.Threading.Thread.Sleep(1000)
        End While
        myThread.Abort()
    End Sub

    Public Sub StopMusic()
        If myThread.IsBackground = True Then myThread.Abort()
        bPLAY = False
        bLOOP = False
        myMusic.Stop()
        myMusic.Dispose()
        myMusic = Nothing
    End Sub

    Public Sub PlayMusic(ByVal fSoundMedia As String, ByVal bSoundLoop As Boolean)
        bLOOP = bSoundLoop
        If bPLAY = False Then
            bPLAY = True
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(fSoundMedia, False)
            myMusic.Play()
            myThread.Start()
        Else
            StopMusic()
        End If
    End Sub
#End Region
End Class
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 19:04
Pour désactiver le MSA j'ai la solution:
Faire ctrl+alt+E et dans Managed Debugging Assistants / et décocher LoaderLock
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 19:06
On peu faire aussi un clique dans le menu sur
Déboguer et Exceptions... ^^

J'arrive toujours pas a threader une lecture de son avec directx avec option LOOP true/false... pfffff

HELP ME !
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 21:35
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                SOUND_FONCTIONS.SoundFile = fSoundMedia
                cls_audio.myThread = New System.Threading.Thread(AddressOf SOUND_FONCTIONS.PlayMusic)
                cls_audio.myThread = myThread
                cls_audio.myThread.Priority = Threading.ThreadPriority.BelowNormal
                cls_audio.myThread.Start()
            Else
                bPLAYING = False
                SOUND_FONCTIONS.StopMusic()
            End If
        End Sub
        Shared Property MusicLoop()
            Get
                MusicLoop = SOUND_FONCTIONS.StartLoop
            End Get
            Set(ByVal value)
                SOUND_FONCTIONS.StartLoop = value
            End Set
        End Property
        Shared Sub Close()
            System.Threading.Thread.Sleep(250)
            SOUND_FONCTIONS.StopMusic()
        End Sub
    End Class
#End Region

#Region "CLASS SOUND_FONCTIONS"
    Private Class SOUND_FONCTIONS
        Friend Shared SoundFile As String, StartLoop As Boolean
        Shared myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing

        Shared Sub PlayMusic()
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(SoundFile, False)
            myMusic.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 21:35
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                SOUND_FONCTIONS.SoundFile = fSoundMedia
                cls_audio.myThread = New System.Threading.Thread(AddressOf SOUND_FONCTIONS.PlayMusic)
                cls_audio.myThread = myThread
                cls_audio.myThread.Priority = Threading.ThreadPriority.BelowNormal
                cls_audio.myThread.Start()
            Else
                bPLAYING = False
                SOUND_FONCTIONS.StopMusic()
            End If
        End Sub
        Shared Property MusicLoop()
            Get
                MusicLoop = SOUND_FONCTIONS.StartLoop
            End Get
            Set(ByVal value)
                SOUND_FONCTIONS.StartLoop = value
            End Set
        End Property
        Shared Sub Close()
            System.Threading.Thread.Sleep(250)
            SOUND_FONCTIONS.StopMusic()
        End Sub
    End Class
#End Region

#Region "CLASS SOUND_FONCTIONS"
    Private Class SOUND_FONCTIONS
        Friend Shared SoundFile As String, StartLoop As Boolean
        Shared myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing

        Shared Sub PlayMusic()
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(SoundFile, False)
            myMusic.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 nov. 2010 à 21:35
JE GALERE DUR !!!
Mais j'y suis presque !!!!!!!!!!!!!!!!

Imports Microsoft.DirectX

Public Class cls_audio
    Friend Shared myThread As System.Threading.Thread
    Shared bPLAYING As Boolean = False

#Region "CLASS SOUND"
    Public Class SOUND
        <MTAThread()> _
        Shared Sub Open(ByVal fSoundMedia As String)
            If bPLAYING = False Then
                bPLAYING = True
                SOUND_FONCTIONS.SoundFile = fSoundMedia
                cls_audio.myThread = New System.Threading.Thread(AddressOf SOUND_FONCTIONS.PlayMusic)
                cls_audio.myThread = myThread
                cls_audio.myThread.Priority = Threading.ThreadPriority.BelowNormal
                cls_audio.myThread.Start()
            Else
                bPLAYING = False
                SOUND_FONCTIONS.StopMusic()
            End If
        End Sub
        Shared Property MusicLoop()
            Get
                MusicLoop = SOUND_FONCTIONS.StartLoop
            End Get
            Set(ByVal value)
                SOUND_FONCTIONS.StartLoop = value
            End Set
        End Property
        Shared Sub Close()
            System.Threading.Thread.Sleep(250)
            SOUND_FONCTIONS.StopMusic()
        End Sub
    End Class
#End Region

#Region "CLASS SOUND_FONCTIONS"
    Private Class SOUND_FONCTIONS
        Friend Shared SoundFile As String, StartLoop As Boolean
        Shared myMusic As Microsoft.DirectX.AudioVideoPlayback.Audio = Nothing

        Shared Sub PlayMusic()
            myMusic = New Microsoft.DirectX.AudioVideoPlayback.Audio(SoundFile, False)
            myMusic.Play()
            While myMusic.Playing = True
                If myMusic.CurrentPosition = myMusic.Duration Then
                    If StartLoop = True Then
                        myMusic.StopWhenReady()
                        myMusic.CurrentPosition = 0
                        myMusic.Play()
                    Else
                        Exit While
                    End If
                End If
                System.Threading.Thread.Sleep(250)
            End While
            SOUND_FONCTIONS.StopMusic()
        End Sub

        Shared Sub StopMusic()
            myMusic.Stop()
            myMusic.Dispose()
            myMusic = Nothing
            If cls_audio.myThread.IsAlive = True Then cls_audio.myThread.Abort()
        End Sub
    End Class
#End Region

End Class
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
3 nov. 2010 à 13:56
Un commentaire d'un amateur en VB.net: BRAVO.

JLuc01
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
3 nov. 2010 à 16:29
Merci JLuc01 sa me fait super plaisir !!!

En échange voici le code final et stable que j'ai partagé:
http://www.vbfrance.com/codes/VB8-LIRE-FICHIER-XM-AVEC-DIRECTX-DIRECTSHOW_52446.aspx
0
Rejoignez-nous