Threadproblem Debug-Library-Fehler
-
Hallo,
endlich hab ich mich mal angemeldet ;).
Oke zum Problem:
Ich habe in meinem Projekt ein Thread mit
AfxBeginThread
gestartet.
Die Funktion dazu ist:
UINT CControlLed::GetPushedButtonThread(LPVOID pParam) { CControlLed* pKlasse = (CControlLed*) pParam; pKlasse->GetPushedButton(); return 0; }
einfachheitshalber enthält die methode lediglich einen link zu einer nicht-statischen methode (die flexibler ist - oder auch nicht?!)
das ist sie:
void CControlLed::GetPushedButton() { while (true) { if (_inp(0x378+1) != 126 && _inp(0x378+1) != m_lastActivePb) { m_lastActivePb = _inp(0x378+1); ((CLPTPortExampleDlg*)m_pWnd)->OnPushButton(_inp(0x378+1)); // Hier kommt der Library-Fehler } Sleep(2000); } }
von hier aus wiederrum setze ich einen ointer auf die Funktion
OnPushButton()
, die allerdings nicht in der Klasse des Threads, sondern in der Hauptdialogklasse liegt. Genau in dieser Zeile kommt dann auch der Fehler :-\
Hier noch die Methode von CLPTPortExampleDlg:
void CLPTPortExampleDlg::OnPushButton(int hexa) { m_Pb1= m_Pb2 = m_Pb3 = m_Pb4 = m_Pb5 = m_Pb6 = FALSE; switch(hexa) { case 94: m_Pb1=TRUE; break; case 254: m_Pb2=TRUE; break; case 62: m_Pb3=TRUE; break; case 110: m_Pb4=TRUE; break; case 118: m_Pb6=TRUE; break; } UpdateData(FALSE); /*RandomLed();*/ }
wo könnte denn jetzt der fehlr liegen? ich schätze, dass es mit dem thread ein konflikt geben müsste.
-
Ich bin eine Erkenntnis weiter...
Es muss wohl daran liegen, dass ich auf eine Funktion, die außerhalb der Threads deklariert ist, zugreifen.
UpdateData()
kennt er zum Beispiel auch nicht.
Was muss ich beachten?
-
ist m_pWnd auch Initialisiert? Außerdem springst Du aus einem Thread in eine Funktion der eigenen Klasse auf eine Fuktion einer anderen Klasse. Is nicht gut. Ich würde den Aufruf
((CLPTPortExampleDlg*)m_pWnd)->OnPushButton(_inp(0x378+1)); so machen: SendMessage(m_pWnd->m_hWnd,WM_....,0,_inp(0x378+1)); //WM.. -> je nachdem wie es in der MessageMap definiert ist oder eine UserMessage erzeugen
oder so Ähnlich, aber auf jeden Fall mit Send- oder PostMessage.
Gruß Matthias
-
Jetzt kommt ne dumme Frage:
wie erzeuge ich ne UserMessage ???
:-\ *peinlich*
-
Ich als fauler Zeitgenosse so:
In StdAfx.h
//################################################################## //User Messages #define UM_NEWFILM (WM_USER+1)
in der MessageMap von CLPTPortExampleDlg
ON_MESSAGE(UM_NEWFILM,OnNewFilm)
und die Funktion dazu:
LRESULT CVorschau::OnNewFilm(WPARAM forceUpdate, LPARAM DateiTitel) { ... }
Aufruf mit:
((CVorschau*)GetOwner())->SendMessage(UM_NEWFILM,TRUE,(LPARAM)(LPCTSTR)m_Dateiname); oder ::SendMessage(GetOwner()->m_hWnd,TRUE,(LPARAM)(LPCTSTR)m_Dateiname);
Alles nur Bsp. mußt du entsprechend anpassen.
Gruß