Thread in einer Klasse erstellen



  • Hallo,
    ich erstelle gerade eine Win32 Konsolenanwendung. Dabei habe ich eine Klasse angelegt. In dieser Klasse wird eine DLL geladen.
    In der selben Klasse möchte ich nun einen Thread anlegen und in dem Thread auf einige DLL-Funktionen zugreifen.

    class PeakCan
    {
    	private:
    		HANDLE hThread;
    		bool Initialized;
    		CPcanApiDrv *myPcanApiDrv;   //DLL
    		static DWORD WINAPI CanRead (LPVOID pParam);
    	public:
    		PeakCan();
    		PeakCan(LPCSTR ClientName, WORD Baudrate, LPCSTR AltNetName);
    		~PeakCan();
                    int ConnectClient (void);
    	protected:
    };
    
    int PeakCan::ConnectClient (void)
    {
    	DWORD dwGenericThread;
    	hThread = CreateThread(NULL, 0, CanRead, myPcanApiDrv, 0, &dwGenericThread);
    	if(hThread == NULL)
        {
    		DWORD dwError = GetLastError();
            cout<<"PeakCan: Error in Creating PeakCanReadThread thread"<<dwError<<endl ;
            return (0);
        }
    	return -1;
    }
    
    DWORD WINAPI PeakCan::CanRead (LPVOID pParam)
    {
    	TCANRcvMsg myCanRecMsgBuff;
    	while(1)
    	{
    		pParam->CANWaitForSingleObject(INFINITE);
    		(CPcanApiDrv)pParam->CANRead(&myCanRecMsgBuff.msgbuff, &myCanRecMsgBuff.hNet, &myCanRecMsgBuff.rcvtime);
    		if(g_fpOnCanReceive != 0)
    			g_fpOnCanReceive(myCanRecMsgBuff);
    	}
    }
    

    Wenn ich das compiliere kommt folgende Fehlermeldung:
    error C2227: Links von "->CANWaitForSingleObject" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist 'LPVOID'
    error C2227: Links von "->CANRead" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist 'LPVOID'

    Warum ist das so? Ich dachte als Parameter übergebe ich einen Pointer auf die DLL und kann dann so innerhalb der Threadfunktio darauf zugreifen.

    Danke schon mal im voraus.

    Gruß
    Michael


  • Mod

    pParam ist LPVOID! Das sagt doch auch die Fehlermeldung.

    Du musst pParam wieder auf CPcanApiDrv casten.

    static_cast<CPcanApiDrv*>(pParam)->CANRead(...)
    


  • Du kannst in dem Thread genauso auf Methoden aus der DLL zugreifen wie du es in deinem Mainthread machen würdest 😉

    CPcanApiDrv *myPcanApiDrv;   //DLL
    

    Das sieht so aus als ob du nicht wirklich verstehst was du da machst. Was genau ist das ? Ein Handle auf die DLL scheint das jedenfalls nicht zu sein. Ist das ein Objekt das du von einer Methode aus der DLL bekommen hast ?
    Dann musst du sowas wie

    (CPcanApiDrv*)pParam)->CANWaitForSingleObject(INFINITE);
    ((CPcanApiDrv*)pParam)->CANRead(&myCanRecMsgBuff.msgbuff, &myCanRecMsgBuff.hNet, &myCanRecMsgBuff.rcvtime);
    

    verwenden, halt einen Cast.



  • Danke für die schnellen Antworten.
    Einen Cast hatte ich versucht, aber die Syntax war falsch 😞

    Jetzt funtkioniert es.

    Danke.


Log in to reply