Thread aus Borland VCL in MFC übertragen
-
hallo,
ich portiere derzeit eine software von borland c++ in die mfc und komme an der thread-geschichte einfach nicht vorbei.
im alten code unter borland wird in der basisklasse TWinWout mittelsDispl = new TDispl(false);ein thread für die zeichenroutine gestartet. die methode TDispl::Execute() läuft solange bis der thread terminiert wird.
void __fastcall TDispl::Execute() { while((!Terminated)) // thread loops until terminated { if(WinWout->DSync) // synchronize to buffer start { WinWout->DSync = false; if(WinWout->pDP.x1 != 0) // be sure to have at least one pointer... { Synchronize(DoDis); // do all Display stuff } } } }ich habe in meinem mfc-projekt die klasse CDispl von CWinThread abgeleitet und darin die beiden methoden InitInstance() und ExitInstance(). Wie kann ich jedoch das obige beispiel aus borland am besten auf mfc portieren?
gruß cappaja
-
Dazu musst Du doch nicht von CWinThread ableiten.
Starte einen Thread mit einer normalen Threadfunktion, und übergib den Zeiger auf die Klasse. In dieser Funktion rufst Du dann Deine Execute Funktion auf. return und fertig.
-
hallo martin,
erstmal danke für die anmerkung. ich führe jetzt den thread wie folgt aus:
m_pThread = AfxBeginThread(ExecuteThread, pWiwoDlg, 0, 0, CREATE_SUSPENDED, 0); m_pThread->ResumeThread();an den erforderlichen punkten im code terminiere ich den thread so:
AfxEndThread(0);die thread-function:
UINT ExecuteThread(LPVOID Param) { while(((CWiwoDlg*)AfxGetMainWnd())->m_pThread->Run()) { if(((CWiwoDlg*)AfxGetMainWnd())->DSync) { ((CWiwoDlg*)AfxGetMainWnd())->DSync = false; if(((CWiwoDlg*)AfxGetMainWnd())->pDP.x1 != 0) { ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->DataTransfer(); Sleep(0); // Setzt Thread auf ready! } } } return 0; }die funktion ExecuteThread() musste ich global anlegen da es konflikte mit dem ersten parameter von AfxBeginThread gab. deswegen die casts auf das hauptfenster.
allerdings schmiert mir beim debuggen unabhängig vom code das programm bei der ersten befehlszeile innerhalb von ExecuteThread() ab. ich vermute das hat mit dem "this" in AfxBeginThread() zu tun. hat mir jemand vielleicht einen vorschlag?
mfg cappaja
-
1. Niemals AfxEndThread verwenden.
2. Warum übergibst Du nicht einfach den CWiwoDlg Zeiger über den lParam Wert der Thread Funktion, wie ich es vorgeschlagen habe?
-
wie sollte ich den thread beenden?
in der ersten befehlszeile meiner threadfunktion ExecuteThread() bekomme ich nach wie vor eine zugriffsverletzung. die funktion ist global definiert da ich sonst probleme mit dem ersten parameter aus AfxBeginThread() bekommen habe.UINT ExecuteThread(LPVOID pParam) { ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->pSP1 = (double*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 2 * sizeof(double) * ((CWiwoDlg*)AfxGetMainWnd())->GlPar.nNperB); ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->pSP2 = (double*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 2 * sizeof(double) * ((CWiwoDlg*)AfxGetMainWnd())->GlPar.nNperB); ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->phlp = (double*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 2 * sizeof(double) * ((CWiwoDlg*)AfxGetMainWnd())->GlPar.nNperB); // Generiert ein Hanning-Fenster in pSP2 for(int i=0; i < ((CWiwoDlg*)AfxGetMainWnd())->GlPar.nNperB; i++) { ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->pSP2[i] = fq*0.5 * (1 - cos(2*M_PI*i / ((CWiwoDlg*)AfxGetMainWnd())->GlPar.nNperB)); } while(((CWiwoDlg*)AfxGetMainWnd())->m_bThreadFlag) { if(((CWiwoDlg*)AfxGetMainWnd())->DSync) { ((CWiwoDlg*)AfxGetMainWnd())->DSync = false; if(((CWiwoDlg*)AfxGetMainWnd())->pDP.x1 != 0) { ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->DataTransfer(); Sleep(0); // Setzt Thread auf ready! } } } HeapFree(GetProcessHeap(), 0, ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->phlp); HeapFree(GetProcessHeap(), 0, ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->pSP2); HeapFree(GetProcessHeap(), 0, ((CWiwoDlg*)AfxGetMainWnd())->m_pGraph->pSP1); return 0; }