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


Anmelden zum Antworten