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.