Frage zum Thread (Merkwürdiger Fehler)



  • Hi, hab da ein prob mit meinem Thread. Wenn ich aus dem thread heraus auf die funktion int writeLog(CString sLog) zugreife, kommt ein bösser fehler weiß aber nicht was ich falsch mache.

    int CDialog::writeLog(CString sLog)
    {
    CEdit *myEdit=(CEdit *)GetDlgItem(IDC_LOG);

    CString sTemp;
    myEdit->GetDlgItemText(IDC_LOG, sTemp);
    CString out;
    out.Format("%s\n%s", sLog, sTemp);
    myEdit->SetDlgItemText(IDC_LOG, out);

    return 0;
    }

    UINT DoWork(LPVOID pParam)
    {
    ....
    CDialogDlg *pDlg = (CDialogDlg *)pParam;
    CString strLog;
    pDlg->writeLog("Fehler: startWinsock, fehler code");
    ......
    return 0;
    }



  • 1. bitte code tags benutzen.
    2. was ist denn der "böse fehler" ? ohne den kann dir schlecht geholfen werden... ich glaube nicht, dass zur zeit jemand seine kristallkugel in betrieb hat.



  • Hahah sorry mein fehler.

    Der Böse fehler ist ein Absturz.

    Fehlermeldung:

    File: wincore.cpp
    Line: 1085



  • Debuging zeigt mir auf:

    void CWnd::GetWindowText(CString& rString) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    


  • Dann ist wohl das Editierfenster (IDC_LOG) nicht vorhanden oder ungültig.



  • Hiho,

    das darf man ja auch nicht so ohne weiteres machen. Die MFC Klassen sind nicht threadsicher.
    Eine Lösung zu deinem Problem wäre es, wenn du aus dem Thread an deinen Dialog eine Message schickst und der Dialog die Nachricht abfängt und den Text in dein Edit-Steuerelement schreibt.



  • Hi, danke für den Tipp

    könntest du mir ein Code bsp geben dafür wie man nachrichten schickt mit string?



  • Hiho,

    du kannst den PostMessage und SendMessage Funktionen einfach 'nen Pointer auf deinen Text mitgeben ... unten ist der mal in LParam gepackt.

    // die nachricht WM_DEINE_EIGENE_MSG muss vom dialog aufgefangen werden können.
    #define WM_DEINE_EIGENE_MSG WM_USER + 1
    
    CString strMess(pcMessage);
    TCHAR* pcMsg = (TCHAR*) malloc(_tcslen(pcMessage) * sizeof(TCHAR) + 10* sizeof(TCHAR));
    //
    // hier dann pcMsg füllen ... mit _stprintf oder wie auch immer
    //
    WPARAM wParam;
    ::PostMessage(m_hWnd, WM_DEINE_EIGENE_MSG, wParam, (LPARAM) pcMsg );
    

    ich übernehme keine Garantie für kompilierbaren code 😉



  • Die Variablen sind alle konfus benannt ... hab das gerad einfach mal kopiert und wollte die variablen ein bissel umbenennen ... aber das solltest du hoffentlich selber hinbekommen mit dem Beispiel.

    *drück Daumen*



  • Ich checks nicht man scheiss post

    #define WM_WRITE_LOG WM_USER + 1
    
    //header
    afx_msg LRESULT writeLog(WPARAM wParam, LPARAM lParam);
    
    //Main
    	//}}AFX_MSG_MAP
    	ON_MESSAGE(WM_WRITE_LOG, writeLog)
    END_MESSAGE_MAP()
    
    //Thread
    CDialogDlg *pDlg = (CDialoglg *)pParam;
    CString * myError = new CString(_T("test")); 
    PostMessage((HWND)pParam, WM_WRITE_LOG, (WPARAM)myError, 0);
    
    //Funktion
    
    LRESULT CDialogDlg::writeLog(WPARAM wParam, LPARAM lParam)
    {
    	MessageBox("angekommen");
    
    	return 0L;
    }
    

    Leider Funktioniert das nicht, kein Aufruf der MessageBox.



  • Hallo,

    PostMessage erwartet ein HWND, aber pParam ist nur ein Zeiger auf CDialogDlg, das passt nicht zusammen. Entweder du greifst richtig auf das [i] zu:

    PostMessage(pParam->m_hWnd, WM_WRITE_LOG, (WPARAM)myError, 0);
    

    oder du nutzt den ebenfalls vorhandenen Cast-Operator (HWND( )), aber dann mit dem richtigen Objekt:

    PostMessage((HWND)*pParam, WM_WRITE_LOG, (WPARAM)myError, 0);
    

    MfG,

    Probe-Nutzer



  • Korrektur, da fehlte etwas:

    PostMessage erwartet ein HWND, aber pParam ist nur ein Zeiger auf CDialogDlg, das passt nicht zusammen. Entweder du greifst richtig auf das HWND zu:

    PostMessage(pParam->m_hWnd, WM_WRITE_LOG, (WPARAM)myError, 0);
    

    oder du nutzt den ebenfalls vorhandenen Cast-Operator ( HWND() ), aber dann mit dem richtigen Objekt:

    PostMessage((HWND)*pParam, WM_WRITE_LOG, (WPARAM)myError, 0);
    

    MfG,

    Probe-Nutzer


Anmelden zum Antworten