SoundPlayer verursacht Speicherlecks?

8

Ich schreibe eine grundlegende Schreib-App in C # und ich wollte, dass das Programm während der Eingabe Schreibmaschinen-Sounds erzeugt. Ich habe das KeyPress-Ereignis auf meiner RichTextBox an eine Funktion angehängt, die einen SoundPlayer verwendet, um bei jedem Tastendruck eine kurze WAV-Datei abzuspielen. Allerdings habe ich nach einiger Zeit bemerkt, dass mein Computer langsamer läuft und meine Prozesse audiodlg überprüft .exe verwendete 5 GIGABYTES RAM.

Der Code, den ich verwende, ist wie folgt:

Ich initialisiere den SoundPlayer als globale Variable beim Programmstart mit

%Vor%

Dann beim KeyPress-Event rufe ich einfach

an %Vor%

Weiß jemand, was die starke Speichernutzung verursacht? Die Datei ist weniger als eine Sekunde lang, also sollte sie das Ding nicht zu sehr verstopfen.

    
Nick Udell 05.11.2010, 16:27
quelle

8 Antworten

5

Verwenden Sie nicht SoundPlayer - verwenden Sie stattdessen die waveOut... API:

Ссылка

SoundPlayer ist mehr wie ein Spielzeug als eine produktionsfertige Komponente, obwohl ich mir sicher bin, dass der MS Praktikant, der es geschrieben hat, es gut meinte. :)

Update: Wenn Sie das verknüpfte Beispiel verwenden und sich mit dem Code vertraut machen, werden Sie sehen, was bei der SoundPlayer -Implementierung wahrscheinlich falsch ist. Bei der Wiedergabe von Audio mit den waveOut... -Funktionen werden zwei In-Memory-Puffer benötigt: ein kleiner für den Header und ein potentiell großer Puffer, der die eigentlichen Beispieldaten enthält. Der Hotfix-Artikel, den Sie verknüpft haben, erwähnt jedes Mal, wenn Play aufgerufen wird, das Leck von einigen hundert Bytes, was bedeutet, dass der Code wahrscheinlich jedes Mal einen neuen Header instanziiert und ihn dann nicht ordnungsgemäß entsorgt. (Dies setzt voraus, dass SoundPlayer die waveOut... API umschließt - ich weiß nicht, ob dies der Fall ist oder nicht)

Programmierer halten die Maxime "Rad nicht neu erfinden" für selbstverständlich. Nun, manchmal muss das Rad neu erfunden werden.

    
MusiGenesis 29.01.2011, 17:50
quelle
2

Es könnte ein Fehler im SoundPlayer sein.

Probieren Sie diesen Artikel auf Code-Projekt , vielleicht gibt es Ihnen ein paar Hinweise.

    
Liviu M. 05.11.2010 16:48
quelle
0

Versuchen Sie, die Methode Load des Soundplayers zu verwenden, um den Sound zu laden, und rufen Sie dann play auf. Play lädt einen zweiten Thread (falls noch nicht geladen) und spielt die Datei ab.

Vielleicht lädt der Konstruktor die Datei anfangs nicht (was ich für möglich halte), sondern assoziiert den Player mit dem Namen der Sounddatei.

    
Liviu M. 05.11.2010 16:33
quelle
0

Ich habe dieses Beispiel gemacht. WWFM (alias "Arbeitete gut für mich). Versuchen Sie, Fehler in Ihrem Code (der, ich bin mir fast sicher, ist rein genug) oder eine andere Sound-Datei suchen.

    
shybovycha 25.01.2011 12:15
quelle
0

Entsorgen Sie den SoundPlayer nach dem Abspielen des Sounds. Führen Sie dann den Garbage Collector aus. Wenn es noch zusätzlichen Speicher verbraucht, passiert etwas wirklich Scheußliches und Sie sollten die Tests auf einem anderen Computer ausführen.

    
matthias.lukaszek 26.01.2011 14:01
quelle
0

Ich habe die PlaySound Funktion in der Win32 API vorher etwas ähnliches zu tun. Obwohl dies nicht in der Sprache ist, die Sie verwenden, ist unten ein Beispiel für ein Programm, das auf jedem 100. Tastendruck 'mahnamahna.wav' spielt (Ja, es war ziemlich lustig)

%Vor%

Das obige funktioniert nicht ohne die folgende dll (hook.dll)

%Vor%     
syllogism 30.01.2011 00:30
quelle
0

Dies ist nicht unbedingt eine Antwort, also werde ich dies nicht als die akzeptierte Antwort auf meine Frage bestätigen, aber es ist eine Lösung für diejenigen, die die gleichen Probleme hatten (und bestätigt auch, dass es nicht mein System ist, das die Schuld trifft )

Ich habe beschlossen, den Sound mit der AudioPlayback-Bibliothek von ManagedDirectX zu implementieren, die so einfach zu verwenden ist wie der SoundPlayer, aber mein Problem erfolgreich gelöst hat.

Für diejenigen, die es wissen wollen, ist der Code einfach:

1) Fügen Sie einen Verweis auf die Audioplayback-DLL hinzu.

2) Erstellen Sie ein Audio-Objekt (ich nannte meinen Sound), machen Sie es zu einer Variablen in Ihrem Formular, damit Sie es erneut verwenden können, verwenden Sie den Konstruktor, um den Dateinamen zu setzen

3) Spielen Sie die Datei mit sound.Play ();

4) Wenn Sie die Datei erneut abspielen müssen, verwenden Sie die folgende Zeile:

%Vor%

Es ist ziemlich schnell und ziemlich gut. Es gibt Speicherprobleme, wenn Sie viele verschiedene Soundeffekte benötigen, da sie alle ständig im Speicher sind. Wenn Sie jedoch einen Sound benötigen, um viel zu spielen, wird dieser ohne Ballooning Ihrer Audiodlg.exe

    
Nick Udell 01.02.2011 23:17
quelle
0

Sie sollten versuchen, ()

zu verwenden %Vor%

Wenn der Prozess sp.Play () beendet wird, kehren Sie zu Ihren Systemautomatiken zurück.

    
Hutchibang 12.11.2011 09:48
quelle

Tags und Links