2

私はプログラミングに非常に慣れていないので、まだ多くの基本を習得する必要があります。しかし、あちこちからの助けを借りて、プログラム全体を作成することができました. ただし、リソースに関してメモリリークが発生したと思います。これもまた新しくて、これを行うには不器用な方法だとほぼ確信しています...

現在、My.Resources に保存されている .wav ファイルを使用するアプリケーションにバックグラウンド ミュージックがあります。オーディオを正常に有効化、無効化、ミュートするための複数の手段を実装しましたが、複数のオーディオ トラックを導入したときに問題が発生しました。プログラムの「設定」領域にある 4 つのバックグラウンド ソング (4 つの .wav リソースとして保存) の間のオプションをエンド ユーザーに提供するという考えです。ソリューションをビルドしてテストすると、すべてが期待どおりにうまく動作します。次に、設定領域でオーディオを別のトラックに変更すると、それも機能します。曲を何度も変更すると問題が発生し、OutOfMemory エラーが発生します。

何が起こっているのか理解できたと思います。リソースは、ユーザーが選択するたびにメモリに追加されますが、-say- song2 が選択されている場合にメモリから -say- song1 を削除する方法がわかりません。オーディオの選択と再生を処理するコードは次のとおりです。

(プログラムは「%chkbox」と呼ばれるラジオ ボタンを使用し、このコードを実行する前にユーザーが「savebtn」を押す必要があります。) Visual Basics 2012 .net 4.5 の使用

    'Save and start songs.

    If DjErhain_Mistychkbox.Checked = True Then
        My.Settings.AudioDJErhain_UWBeats_Maniac = 0
        My.Settings.Save()
        My.Settings.AudioDjErhain_Misty = 1
        My.Settings.Save()
        My.Settings.AudioMachinimaSound_Exigence = 0
        My.Settings.Save()
        My.Settings.AudioSimplex_Memories_master = 0
        My.Settings.Save()

        My.Computer.Audio.Play(My.Resources.DjErhain_Misty, AudioPlayMode.BackgroundLoop)


    ElseIf DJErhain_UWBeats_Maniacckbox.Checked = True Then
        My.Settings.AudioDjErhain_Misty = 0
        My.Settings.Save()
        My.Settings.AudioDJErhain_UWBeats_Maniac = 1
        My.Settings.Save()
        My.Settings.AudioMachinimaSound_Exigence = 0
        My.Settings.Save()
        My.Settings.AudioSimplex_Memories_master = 0
        My.Settings.Save()

        My.Computer.Audio.Play(My.Resources.DJErhain_UWBeats_Maniac, AudioPlayMode.BackgroundLoop)


    ElseIf MachinimaSound_Exigencechckbox.Checked = True Then
        My.Settings.AudioMachinimaSound_Exigence = 1
        My.Settings.Save()
        My.Settings.AudioDJErhain_UWBeats_Maniac = 0
        My.Settings.Save()
        My.Settings.AudioDjErhain_Misty = 0
        My.Settings.Save()
        My.Settings.AudioSimplex_Memories_master = 0
        My.Settings.Save()

        My.Computer.Audio.Play(My.Resources.MachinimaSound_Exigence, AudioPlayMode.BackgroundLoop)


    ElseIf Simplex_Memories_masterchckbox.Checked = True Then
        My.Settings.AudioSimplex_Memories_master = 1
        My.Settings.Save()
        My.Settings.AudioDJErhain_UWBeats_Maniac = 0
        My.Settings.Save()
        My.Settings.AudioDjErhain_Misty = 0
        My.Settings.Save()
        My.Settings.AudioMachinimaSound_Exigence = 0
        My.Settings.Save()

        My.Computer.Audio.Play(My.Resources.Simplex_Memories_master, AudioPlayMode.BackgroundLoop)

    Else
    End If
4

1 に答える 1

1

はい、これはうまくいかない可能性があります。.wav 形式はあまりコンパクトではありません。リソースに配置すると、リソースを使用すると UnmanagedMemoryStream が作成されます。もう使用しない場合は破棄する必要があります。ガベージコレクターは、問題を回避するのに十分な頻度で実行されません。

プロジェクトに新しいモジュールを追加し、次のコードを貼り付けます。

Imports System.IO

Module PlayerUtilities

    Private CurrentStream As WeakReference(Of Stream)

    Public Sub PlayResource(wave As Stream)
        My.Computer.Audio.Play(wave, AudioPlayMode.BackgroundLoop)
        Dim oldwave As Stream = Nothing
        If CurrentStream IsNot Nothing AndAlso CurrentStream.TryGetTarget(oldwave) Then
            oldwave.Dispose()
        End If
        CurrentStream = New WeakReference(Of Stream)(wave)
    End Sub

End Module

My.Computer.Audio.Play() への呼び出しを PlayResource() に置き換えます。前のオーディオ ストリームのこのメソッドで Dispose() を呼び出すと、トラブルを回避できます。

于 2013-11-11T20:48:04.323 に答える