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).
-
http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel17.htm
da findest du beispiele.
-
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 willHier 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