Zugriff von globalem Thread auf Statusleiste!
-
Guten Abend,
ich möchte von einem globalem Thread aus auf die Statusleiste zugreifen und bekomme immer eine Ausnahme zugeworfen: irgendwas in Zeile 888 in der wincore.cpp!
Das ganze steht wie gesagt in einem globalem Thread und sieht etwa so aus:CMyApp* lApp = reinterpret_cast<CMyApp*>(AfxGetApp()); CMainFrame *pM = (CMainFrame*)(lApp->m_pMainWnd); pM->m_wndStatusBar.SetPaneText(pM->m_wndStatusBar.CommandToIndex(ID_INDICATOR_INFO), lStr, true);
lStr ist ein CString und das true hab ich auch schon weggelassen. Hat jemand eine Idee?
-
Die MFC ist nicht multithreading sicher, jede art von calls in eine MFC klasse die nicht vom window thread kommen sollten vermieden werden (geht bei ~90% der methoden schief).
Lösen kannst du das über ne window message (SendMessage mit einer benutzerdefinierten message an das main window und das führt deine code als reaktion darauf aus).
-
Danke für die schnelle Antwort! Sowas in der Art dachte ich mir schon. Hast Du vielleicht ein paar Codeschnipsel für Deinen Vorschlag? Hab sowas noch nicht gemacht. Muss man die irgendwie registrieren, oder lieg ich da falsch? Ich google mich mal schlau.
-
Muss ich die Nachricht mit RegisterWindowMessage registrieren, und wenn ja wo? In der OnCreate() der Applikation?
-
Wenn ich die Nachricht folgendermaßen definiere:
#define WM_INFOUPDATE WM_APP + 1
dann bekomme ich an
ON_REGISTERED_MESSAGE(WM_INFOUPDATE, OnInfoUpdate)
die Fehlermeldung C2101: '&' auf Konstante!
Weiss jemand, was ich falsch mache?
-
Blöder Fehler! Es muss ON_MESSAGE statt ON_REGISTERED_MESSAGE heissen. Hat jemand vielleicht einen Link, wo das Senden von Nachrichten Schritt für Schritt erklärt wird?
-
Also ich hab es so gelernt, dass man "eigene" Messages so "Definieren" soll.
#define WM_INFOUPDATE WM_USER + 1
-
Funktioniert auch. Die WM_USER Konstante bezieht sich nur auf die Fensterklasse, während WM_APP für die ganze Applikation gilt.