Text von Thread an die View übermitteln
-
Hallo zusammen,
Hab leider noch net viel Erfahrung mit MFC und soll nun ein Prog schreiben, das Texte von anderen Programmen empfängt und anzeigt. Empfangen wird der Text mit einer Pipe, die in einem Thread läuft aber wie bekomme ich nun den empfangenen text in der View angezeigt.
Die Thread Funktion
HANDLE ThreadHandle; // INT i; DWORD ThreadId; // Create a thread to serve each pipe instance if ((ThreadHandle = ::CreateThread(NULL, 0, PipeInstanceProc, NULL, 0, &ThreadId)) == NULL) { printf("CreateThread failed with error %\n", GetLastError()); return FALSE; } CloseHandle(ThreadHandle); return TRUE; }Die Pipe Funktion
DWORD WINAPI PipeInstanceProc(LPVOID lpParameter) { HANDLE PipeHandle; DWORD BytesRead; CHAR buffer[256]; if ((PipeHandle = CreateNamedPipe("\\\\.\\Pipe\\Jim", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL)) == INVALID_HANDLE_VALUE) { printf("CreateNamedPipe failed with error %d\n", GetLastError()); return 1; } printf("Server is now running\n"); while(true) { if (ConnectNamedPipe(PipeHandle, NULL) == 0) { printf("ConnectNamedPipe failed with error %d\n", GetLastError()); CloseHandle(PipeHandle); return 1; } if (ReadFile(PipeHandle, buffer, sizeof(buffer), &BytesRead, NULL) <= 0) { printf("ReadFile failed with error %d\n", GetLastError()); CloseHandle(PipeHandle); return 1; } printf("%.*s\n", BytesRead, buffer); if (DisconnectNamedPipe(PipeHandle) == 0) { printf("DisconnectNamedPipe failed with error %d\n", GetLastError()); return 1; } } CloseHandle(PipeHandle); return 0; }und die View
void CMFCStartUpView::OnDraw(CDC* pDC) { CMFCStartUpDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rc; GetClientRect(&rc); CFont Fnt1, Fnt2, *pOldFnt; LOGFONT lfnt; ZeroMemory(&lfnt, sizeof(LOGFONT)); strcpy(lfnt.lfFaceName, "Arial"); lfnt.lfWeight = FW_BOLD; lfnt.lfHeight = 20; Fnt1.CreateFontIndirect(&lfnt); lfnt.lfHeight = 25; lfnt.lfUnderline = TRUE; Fnt2.CreateFontIndirect(&lfnt); CMFCStartUpView::InitiateTrace(); CMFCStartUpView::DeInitiateTrace(); CMFCStartUpView::ReadTrace(); // m_szBuffer="Hallo"; pOldFnt = (CFont *)pDC->SelectObject(&Fnt1); pDC->DrawText(m_szBuffer, rc, DT_TOP); pDC->SetTextColor(RGB(0,150,0)); // pDC->DrawText(sTxt1, rc, DT_CENTER); int dx = (int)0.2*rc.Width(); int dy = (int)0.45*rc.Height(); m_LinkRect = CRect(rc.left+dx, rc.top+dy, rc.right-dy, rc.bottom-dy); pDC->SelectObject(pOldFnt); UpdateWindow(); }Pipe und thread befinden sich in der selben Quellcode-Datei, die View in einer anderen.
Mir wurde bereits gesagt dass das irgendwie mit GetActiveView()->Postmessage funktionieren soll aber ich hab da bisher nicht so den passenden Ansatz gefunden.
Wäre Super wenn mir da jemand helfen könnte.
mfg
Phoe
-
GetActiveView()->SendMessage(WM_APP_ADDTEXT, NULL, reinterpret_cast<LPARAM>( string.GetString() ));und dann im view auf die message reagieren mit ON_MESSAGE, etc.
also:ON_MESSAGE(WM_APP_ADDTEXT, OnAddText) //... LRESULT DeineViewKlasse::OnAddText(WPARAM wParam, LPARAM lParam) { CString message = reinterpret_cast<LPCTSTR>( lParam ); if(message != _T("")) //zeig den text an... return 0; }