Frage zu Henke soft Threads
-
Hi zusammen,
ich mach grad die Threads im Henkesoft Tutorial.
An der Stelle an der die CheckBox hinzu gefügt wir bekomm ich aber eine "unknown software exception".Ich versuch den Fehler schon seit ein paar Stunden zu finden aber es hilft nix.
Hier mal mein Code ...Dlg.cpp :
void CNeuDlg::OnButton1() { m_Flag = 1; // Membervariable um Thread korrekt zu beenden CWinThread* pThread1 = AfxBeginThread (ThreadProc1, this); CWinThread* pThread2 = AfxBeginThread (ThreadProc2, this); pThread1->SetThreadPriority (THREAD_PRIORITY_HIGHEST); } UINT CNeuDlg::ThreadProc1(LPVOID pParam) // ThreadFunktion { CNeuDlg *pDlg = new CNeuDlg; pDlg->ThreadRun1(); return 0; } UINT CNeuDlg::ThreadProc2(LPVOID pParam) // ThreadFunktion { CNeuDlg *pDlg = new CNeuDlg; pDlg->ThreadRun2(); return 0; } void CNeuDlg::ThreadRun1() // Nicht statische Memberfunktion { while (m_Flag) { Sleep(10); m_ctrlCheck.SetCheck (TRUE); // ::MessageBox (0,"Thread 1 ausgelöst !","Thread",MB_OK); } } void CNeuDlg::ThreadRun2() // Nicht statische Memberfunktion { while (m_Flag) { Sleep(1001); m_ctrlCheck.SetCheck(FALSE); // ::MessageBox (0,"Thread 2 ausgelöst !","Thread",MB_OK); } }Und der Code der ...Dlg.h :
class CNeuDlg : public CDialog { // Konstruktion public: CNeuDlg(CWnd* pParent = NULL); // Standard-Konstruktor int m_Flag; void ThreadRun1(); void ThreadRun2(); static UINT ThreadProc1(LPVOID pParam); static UINT ThreadProc2(LPVOID pParam); // Dialogfelddaten //{{AFX_DATA(CNeuDlg) enum { IDD = IDD_NEU_DIALOG }; CButton m_ctrlCheck; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CNeuDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: HICON m_hIcon; // Generierte Message-Map-Funktionen //{{AFX_MSG(CNeuDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnButton1(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. #endif // !defined(AFX_NEUDLG_H__65B48A9F_DEAD_4D06_A375_B744FD7C5D27__INCLUDED_)Danke für eure Mühe

ShadowEater
-
Danke, hab den Fehler !

ShadowEater
-
Kannst Du Dich mal genauer auslassen? Wäre vielleicht einen Hinweis oder eine Änderung im Tutorial wert.
-
Hallo Hr. Dr. Henkes,
klar kann ich, es handelt sich um folgendes: in ihrem Mfc Tutorial, der Teil der die Threads behandelt, in dem Abschnit zur Synchronisation beschreiben Sie die Funktion :
void CThread001Dlg::thrRun3() { while (m_Flag) { m_strEdit2 = m_strEdit1; UpdateData(FALSE); // <------ Hier bekomme ich den Fehler } }Führe ich den Quelltext genau so aus bekomme ich ständig die Fehlermeldung "Debug Assertion Failed". Dies ist auf den Aufruf von UpdateData(False).
Führe ich aber UpdateData in OnStart aus:void CHeSoThread002Dlg::OnStart() { m_Flag = 1; CWinThread* pThread1 = AfxBeginThread (ThreadFunction1, this); CWinThread* pThread2 = AfxBeginThread (ThreadFunction2, this); CWinThread* pThread3 = AfxBeginThread (ThreadFunction3, this); //********************************************************************** UpdateData (FALSE); // <------ Hier klappts //********************************************************************** }funktioniert alles bestens !
Ich hoffe ich konnte behilflich sein

regards
ShadowEater
-
Aus einem Thread darf man nicht auf UI-Elemnte zugreifen die nicht in dem Thread erstellt wurden!
Verwende WM_APP+x um dem "Hautpthread" mitzuteilen was Du auf der UI upgedated haben willst.
Also *kein* UpdateData aus dem Thread heraus aufrufen!
-
Hi Jochen,
kannst Du ein bisschen konkreter werden wie das mit WM_APP+x funktioniert.

ShadowEater