Thread-Problem



  • Hi wertes Forum,

    ich bin gerad dabei mir mp3 aus wav zu encoden
    benutzt dafür fmod und den lame encoder
    die von cdialog abgeleiete klasse CRippCDA2MP3 enthält einen
    workerthread, der das encoden selbst übernimmt.
    das hier:

    UINT CRippCDA2MP3::ThreadProc(LPVOID param)
    {
    	bool isCreating;
    
    	//gib mal was im dialog ins textbox aus
    	CRippCDA2MP3* pRippDlg = (CRippCDA2MP3*) param; 
    	CEdit* pRippDlgEdit = NULL;
    	pRippDlgEdit = (CEdit*) pRippDlg->GetDlgItem(IDC_EDIT1);
    	pRippDlgEdit->SetWindowText("irgendwas");
             //fehlt dieser ausgabe-teil funzt alles super
    
    	do
    	{
    		systemEncMP3->update();
    		channelEncMP3->isPlaying(&isCreating);
    	} while( isCreating );
    	soundEncMP3->release();
    	systemEncMP3->close();
    	systemEncMP3->release();
    
    	FileRename("fmodoutput.mp3");
    	isEncoding = false;
    	return 0;
    }
    

    encoden funzt gut. NUR: während des encodens will ich natürlich auch mal
    was in dem diaologfenster ausgeben, bitte warten oder ne zeitanzeige was weiss
    ich. irgendwie will das aber nicht. gibt nix aus und beendet den thread dann auch nicht richtig. (ich ja geträumt von paralellverarbeitung - aber nix da)

    was mach ich denn da falsch, ein thread soll ja die weiterbenutzung des programms sicherstellen, dann kann man ja wohl auch ein bissl text ausgeben lassen !?!? sprech ich das cedit richtig an?

    hat jemandd nen idee

    gruss
    klausi



  • So geht das nicht -- Du kannst nicht aus 2 Threads heraus auf dieselben Komponenten zugreifen. Nur der Thread, der ein Fenster erstellt hat, sollte auch darauf zugreifen. Wenn Du willst, dass 2 Threads sauber miteinander kommunizieren, verschick Nachrichten (am einfachsten mit PostMessage()).

    Und wenn Du Programme startest, nimm CreateProcess() und setz das DETACH-Flag, damit der Prozess asynchron zu Deinem laeuft. Du pruefst dann z.B. periodisch, ob Deine Daten geschrieben wurden. Oder Du setzt das DETACH-Flag nicht, und startest Prozess asynchron (Flag weiss ich grade nicht). Dann kannst Du auf das Beenden des Prozesses testen oder warten. (Siehe Prozesse-Kapitel in der Windows Platform SDK Dokumentation, http://msdn.microsoft.com/library/ )

    Windows hat uebrigens eingebaute Kompressionsfunktionen (schau mal unter dem Kapitel ACM in der Platform SDK Doku nach).





  • Hallo,

    Danke für die Hinweise, werd mich gleich mal dransetzen

    @Power off: ich kann also nicht auf members einer klasse von einer
    Thread-Funktion aus zugreifen. Kann ich so gar nicht glauben - jedenfalls
    könnte ich nicht, wenn ichs nicht schon mal gemacht hätte.
    ich hoff du meinst mit "2 threads" einen programmthread und meinen workerthread
    ?? also es ist nur ein workerthread in einer klasse in der sich auch die member
    befindet, auf die ich im thread zugreifen will

    Hier frag ich zB in einem thread laufend die anzahl der listeneinträge ab - funzt.

    UINT MyListView::ThreadProc(LPVOID param)
    {
    int nItemCount = 0;
    CString str = _T("");
    CString find = _T("");
    MyListView* pView = (MyListView*) param;

    CListCtrl* pListCtrl = NULL;
    pListCtrl = (CListCtrl*) pView->GetDlgItem(IDC_LIST1);
    nItemCount = pListCtrl->GetItemCount();
    for(int j=0; j<10000; j++)
    {
    ....
    }
    pView = NULL;
    pListCtrl = NULL;
    return 0;
    }

    das wollte ich nun einfach mal kurz auf mein sch... dialog übertragen
    das ist doch quasi dasselbe - oeder irr ich mich da ?

    gruss
    klausi


Anmelden zum Antworten