MFC-GUI in einen eigenen Thread packen?
-
Hallo,
ich habe hier eine Applikation programmiert, die einige Aufgaben erledigen soll. Leider macht mir das Zeichnen der GUI Probleme.

Da ich Audiodaten ausgebe und meine GUI permanent eine Laufvariable aktualisiert darstellen soll, bricht die Audioausgabe manchmal beim Klicken auf die GUI ab...
Wie kann ich denn die Standard MFC-GUI in einen eigenen Thread packen, sodass das Neuzeichnen gesondert abgehandelt wird? Gibt's da ein Tutorial?
Vielen Dank im voraus
Gruß
kk3003
-
mach die audioausgabe in einen extra thread. das dürfte einfacher sein...
-
das hatte ich auch schon überlegt.....
da die Daten aber vom Netzwerk-Socket kommen, bin ich da irgendwie nicht weiter gekommen.
Gibt's evtl. hierfür ein Tutorial?*danke*
Gruß
kk3003
-
/* Doppelpost->BrowserSpinnte() */

-
/* Doppelpost->BrowserSpinnte() */

-
Gerade mit Sockets hast du kein Problem, die sind unter Windows von hausaus threadsafe. Also Thread machen, der macht dann die "lese-und-spiele" Schleife, ferdich.
Weiss nicht ganz wo das Problem ist... sag mal näheres wenn du nicht klarkommst.
-
mein performance-flaschenhals steckt eher darin, dass ich alle empfangenen Pakete via memcpy in den PlaybackBuffer kopiere. Man sollte hier besser mit Zeigern arbeiten, leider bin ich damit noch nicht so firm.

Hier etwas Pseudocode:
#define PACKET_PAYLOAD 1024 #define PACKET_PAYLOAD_MULTIPLIER 10 // DECLARATION char receivedPacket[PACKET_PAYLOAD]; char waveBuffer4Playback[PACKET_PAYLOAD*PACKET_PAYLOAD_MULTIPLIER]; int packetCounter; [....] void OnInitDialog() { packetCounter = 0; } // PSEUDOCODE void MeineAppDlg::OnReceivePacket() { // fetch packet content mySocket.Receive( receivedPacket, sizeof(receivedPacket) ); // increment packetCounter packetCounter++; // send to buffer preparation MeineAppDlg::PrepareBuffer4Playback(); } void MeineAppDlg::PrepareBuffer4Playback() { // push receivedPacket into PlaybackBuffer memcpy( waveBuffer4Playback+(packetCounter*PACKET_PAYLOAD), receivedPacket); // Wenn Buffer voll, d.h. 10 Pakete empfangen -> an Soundkarte übergeben.. [...] }Danke für jede Hilfe
Gruß
kk3003
-
mein performance-flaschenhals steckt eher darin, dass ich alle empfangenen Pakete via memcpy in den PlaybackBuffer kopiere
Das glaube ich nicht, da ein Audio-Stream mit CD-Qualität gerademal ~170kB/Sekunde an Daten hat/braucht. Selbst wenn du 8-Kanal mit 24 Bit und 96kHz spielst sind es gerademal 2,25MB/Sekunde. Die Speicherbandbreite von einem modernen PC beträgt > 1GB/Sekunde, also WEIT mehr als dafür notwendig.
Ergo: dein Problem liegt woanders.
-
ich dachte eher, da die Ausgabe der Laufvariable (120xReDraw/s) und das Umkopieren der Daten (memcpy) in Thread, in der auch die GUI läuft meine Audioaussetzer verursacht?!
Gruß
kk3003