016
19.10.2004, 19:51 Uhr
Spacelord
Hoffnungsloser Fall
|
Also ich hab das Projekt fertig. Wenn du magst kann ich dir das Ganze per Mail zuschicken. Dann kannst du dir das ja erstmal angucken und bei den Punkten wo du Probleme hast konkrete Fragen stellen.
Die Kernfunktionalität ist aber diese:
C++: |
//Die Message_Map der FormView BEGIN_MESSAGE_MAP(CCFVthreadView, CFormView) //{{AFX_MSG_MAP(CCFVthreadView) ON_BN_CLICKED(IDC_THREAD_START, OnThreadStart) ON_BN_CLICKED(IDC_THREAD_STOP, OnThreadStop) //}}AFX_MSG_MAP // Standard-Druckbefehle ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview) /*************************************************************** ganz wichtig ist es diese Zeile einzufügen damit die View auf die Nachricht WM_USER+22 reagiert!! Die Zahl 22 ist übrigens willkürlich.*/ ON_MESSAGE(WM_USER+22,OnThreadMessage) //**************************************************************
END_MESSAGE_MAP()
|
und die relevanten Methoden:
C++: |
void CCFVthreadView::OnThreadStart() { stillrunning=true;//stillrunning ist global als volatile bool deklariert AfxBeginThread (Thread,GetSafeHwnd()); }
void CCFVthreadView::OnThreadStop() { stillrunning = false; }
UINT CCFVthreadView::Thread(LPVOID param) { HWND hView = (HWND)param;//Parameter wieder in ein HWND casten while(stillrunning) { Sleep(1000); //Der View die Nachricht WM_USER+22 senden ::PostMessage(hView,WM_USER+22,NULL,NULL); } return 0; }
void CCFVthreadView::OnThreadMessage() { //Der Thread gibt der View nur eine Nachricht und die //View kann dann alles wie gewohnt machen. //-keine Synchronisationsprobleme! //-und vor allem keine Assertion Failures weil im Thread fehlerhaft //MFC Pointer verwendet wurden!! CString temp; temp.Format("Tach Post zum %i.",dieZahl);//dieZahl ist ein int Attribut m_Text.SetWindowText(temp);//m_Text ist ein Attribut vom Typ CStatic dieZahl++; }
|
Die FormView hat 2 Button Start/Stopp und ein CStatic zur Textausgabe.Ist also in etwa so wie bei dir. Das Prinzip ist jetzt folgendes: Der Thread wird bei Buttondruck gestartet. Die Threadfunktion wartet ca.1000 ms und sendet dann die Benutzernachricht WM_USER+22 an die View.Dafür nutzt der Thread das übergebene HWND und PostMessage. Im primären Thread holt die View die Nachricht aus der Warteschlange und führt daraufhin OnThreadMessage() aus.Die eigentliche Funktionalität stellt also die View selbst bereit. Damit gehst du sehr vielen Problemen aus dem Weg. Grundsätzlich gilt dass man MFC-Fenster/CDC/Menü-Objekte nur in dem Thread benutzen sollte der sie erstellt hat! Das tust du bei dieser Lösung.
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. Dieser Post wurde am 19.10.2004 um 19:58 Uhr von Spacelord editiert. |