Probleme beim Erzeugen eines Threads



  • Habe folgendes Problem:
    Ich möchte aus einer Anwendung heraus einen Worker-Thread starten.
    Über Menüauswahl wird nach einigen Initialisierungen ein nicht-modaler Dialog geöffnet.

    CChessGamesDoc::GenerateDB()
    {
        // verschiedene Initialisierungen
    
        m_generateDBView.Create(IDD_DBGENERATE, NULL);
        // IDD_DBGENERATE ist der mit dem Resourceneditor erzeugte Dialog
    
        ....
    
        m_generateDBView.UpdateData(FALSE);
        m_generateDBView.UpdateWindow();
    
        ....
    }
    

    Nach den Initialisierungen soll die Funktion CollectAllMoves() als neuer Thread gestartet werden.

    AfxBeginThread(CollectAllMoves, &GenParam);  // Zeile 259!!
    

    GenParam ist dabei eine Struktur, die mehrere Parameter an die Funktion übergibt.
    Die Funktion CollectAllMoves() selbst ist wie folgt deklariert:

    UINT CChessGamesDoc::CollectAllMoves(LPVOID pParam)
    

    Beim Compilieren erhalte ich dann aber folgende Fehlermeldung:

    ...\ChessGames\ChessGamesDoc.cpp(259) : error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (void *)' konvertiert werden

    (Zeile 259 ist Codebeispiel oben!)

    Bitte helft mir !!!
    Was mache ich falsch !!! 😞 😕

    THX Steffen



  • Hallo,

    diese Funktion mus Statisch sein!

    in der cpp:

    UINT CChessGamesDoc::CollectAllMoves(LPVOID pParam)
    {
       return 0;
    }
    

    in der h:

    class CChessGamesDoc : public CDialog
    {
     public:
       CChessGamesDoc();
       virtual ~CChessGamesDoc();
    
     private:
       static UINT CollectAllMoves(LPVOID pParam);
    }
    

    Du solltest niemals lokale Parameter an einen Thread übergeben, das killt
    Dich!

    Lege die Parameter-Struktur auf den Heap an.

    void CChessGamesDoc::StartThread()
    {
       GenParam* pParameter = new GenParam;
       // Parameter füllen...
    
       AfxBeginThread(CollectAllMoves, (LPVOID)pParameter;
    }
    
    UINT CChessGamesDoc::CollectAllMoves(LPVOID lpParameter)
    {
      GenParam* pParameter = reinterpret_cast<GenParam*>(lpParameter);
    
      // mache was mit den Parametern...
    
      delete pParameter;  // Parameter auf den Heap zerstören
    
      return 0;
    }
    

    So sollte es gehen...

    Gruss
    EB



  • Vielen Dank erstmal!
    Der Fehler mit dem AfxBeginThread() ist jetzt weg!
    Dafür habe ich jetzt 53(!) neue Fehler! 😞
    Wie schon angedeutet, sollen die Aktivitäten der Funktion CChessGamesDoc::CollectAllMoves() im Dialog CGenerateDBDlg dargestellt werden.
    Dazu habe ich in der Klasse CGenerateDBDlg mehrere Member-Variablen deklarier, die die Felder des Dialogs via DDX ändern.
    Das ganz sieht so aus:

    In der CGenerateDBDlg.h:

    class CGenerateDBDlg : public CDialog
    {
        .....
    // Dialogfelddaten
    	//{{AFX_DATA(CGenerateDBDlg)
    	enum { IDD = IDD_DBGENERATE };
    	CString	m_elapsedTime;
        .....
    	//}}AFX_DATA
        .....
    }
    

    in der ChessGamesDoc.h:

    #include "GenerateDBDlg.h"	// Hinzugefügt von der Klassenansicht
    
    class CChessGamesDoc : public CDocument
    {
        .....
    // Implementierung
    public:
        static UINT CollectAllMoves(LPVOID);
    .....
        CGenerateDBDlg m_generateDBView;
    .....
    }
    

    und in der ChessGamesDoc.cpp

    UINT CChessGamesDoc::CollectAllMoves(LPVOID pParam)
    {
    .....
        m_generateDBView.m_elapsedTime = tDiff.Format("%D d %H h %M min %S s");
        m_generateDBView.UpdateData(FALSE);
    .....
    
    }
    

    Wenn ich das jetzt so compiliere erhalte ich für alle Programmzeilen in ChessGamesDoc.cpp, in denen auf m_generateDBView zugegriffen wird folgende Fehlermeldung:

    ChessGames\ChessGamesDoc.cpp(288) : error C2228: Der linke Teil von '.m_elapsedTime' 
    muss eine Klasse/Struktur/Union sein
    

    😞
    Ein weiterer Fehler, der jetzt auftritt ist folgender:

    ChessGames\ChessGamesDoc.cpp(320) : error C2597: Ungueltige Referenz auf ein Datenelement 
    'CChessGamesDoc::m_moveCount' in  einer statischen Member-Funktion
    

    Dabei ist m_moveCount in ChessGamesDoc.h innerhalb der Klasse CChessGamesDOC deklariert als

    LONG m_moveCount;
    

    Und um die Sache komplett zu machen, hier noch der letzte FRehlerty, der zuvor (ohne die static-Deklaration) auch nicht aufgetreten ist:

    ChessGames\ChessGamesDoc.cpp(320) : error C2105: '++' muss ein L-Wert sein
    

    Diese Fehlermeldung bezieht sich auf die Programmzeile

    m_moveCount++;
    

    wobei auch hier m_moveCount eine Membervariable von CChessGamesDoc ist.

    Was mache ich jetzt schon wieder falsch! 😡

    😕



  • Dir ist aber klar, dass du aus einer statischen Methode nicht auf nichstatische Member zugreifen kannst? Wie man das löst, wurde hier übrigens schon sehr oft behandelt.



  • Danke, aber leider zu spät! Der Beitrag war schon drin! 🙂

    Aber vielleicht kann mir doch nochmal einer das Problem erläutern. Mit static-Funktionen tu ich mich immer ein bißchen schwer. 😉


Anmelden zum Antworten