000
29.01.2006, 22:07 Uhr
Tommyknocker1980
|
Hallo,
folgendes Problem : Ich habe einen Thread, doch irgendwie scheint sich etwas zu verklemmen.
Beschreibung des Programms: Mein Thread ändert zyklisch die Beschriftung der Zeileninhalte einer ListrCtrl (Diese hat insgesamt nur 4 Zeilen).
Problem: Wenn ich wild an der Oberfläche herumklicke bleibt das Programm hängen!
Mit wild herumklicken meine ich zB: Schnelles öffnen/schließen eines Popup-Menüs (erscheint beim Klicken auf meine Toolbar) oder einfach mal lange Mausklicks auf die Oberfläche etc..
Hinweis Mein Programm ist zwar für embedded Visual C++ (für PDA), aber vielleicht weiß ja jemand hier auch einen Rat.
FRAGE Hängt das vielleicht mit dem schnellen umändern der Listenzeile mittels SetItemText zusammen? Manchmal erwischt man anscheinend einen Zeitpunkt wo sich das System "aufhängt". Vielleicht löst SetItemText intern irgendwelche MFC-Messages aus auf deren Antwort gewartet werden muss, und gleichzeitig werden auch Windows-Messages beim Öffnen des Popup-Menüs erzeugt, auf deren Abarbeitung gewartet werden muss (Liste wird ja über Thread upgedatet)
Code Mein Thread ist eine statische private Methode meiner Klasse und wird wie folgt aufgerufen:
C++: |
void CMyClass::StartThread(void) { // Anweisungen ...
AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL);
// Anweisungen ... }
|
Hier der Quellcode des Threads und der Methode zum Upaten der ListCtrl:
C++: |
UINT CMyClass::ThreadProc(LPVOID pParam) { CMyClass* pView = (CMyClass*) pParam; ASSERT(pClass);
while(!pClass->m_bThreadStopped) { // Anweisungen ... // Aufruf einer Methode welche die ListCtrl von CMyClass updatet
pClass->UpdateList();
// Anweisungen ... }
ExitThread(0); return 0; }
void CMyClass::UpdateList(void) { // Anweisungen ... // Aktuelle betrachteten Eintragder Liste updaten, also // den Beschriftungstext ändern // m_pMyList ist von ListCtrl abgeleitet
m_pMyList->UpdateItem(m_nCurrentItem, strNewItemText) // Anweisungen ... }
|
Hier der wichtige Code der von ListCtrl abgeleiteten Klasse
C++: |
void CMyListCtrl::UpdateItem(int nItem, CString strItemText) { // Neuen String auf dem Heap erzeugen. Weiß ja nicht wann die // Nachrichtenbehandlung erfolgt in welcher der String gebraucht wird.
CString* pStrItemText= new CString(strItemText);
// Die Nachricht WM_UPDATE_ITEM benutzerdefiniert // Nachricht versenden, damit das ausführen des Listupdates im // "Hauptthread" stattfindet
PostMessage(WM_UPDATE_ITEM, (WPARAM) nItem, (LPARAM) pStrItemText); }
LRESULT CMyListCtrl::OnUpdateItem(WPARAM wParam, LPARAM lParam) { int nIndex = (int) wParam; CString *pStrItemText= (CString *) lParam;
SetItemText(nIndex , 0, *pStrItemText);
// Speicher auf dem Heap wieder frei geben
delete pStrItemText;
return 0L; }
|
Durch das Senden der Nachricht WM_UPDATE_ITEM wird der Update der Liste im "Hauptthread", welcher "Besitzer" der Oberflöche ist, durchgeführt.
Weiß keinen Rat warum mein Programm hängen bleibt und bin für jede Bemerkung/Hilfe dankbar!
Vielen Dank, Gruß Tom Dieser Post wurde am 29.01.2006 um 22:07 Uhr von Tommyknocker1980 editiert. |