Threadklasse so korrekt?



  • Ah danke für den Hinweis mit Destruktoren.. Wüsste nicht wie ich das mit Destruktor hinbekommen sollte weil klar dass ich einen benutze.



  • Wäre es so korrekt?

    class Thread
    {
    public:
    	// Handle of the thread
    	HANDLE m_HandleThread;
    	// ID of the thread
    	DWORD  m_ThreadID;	
    
    public:
    	virtual ~Thread () 
    	{
    		// Dummy
    	}
    
    	virtual void start () 
    	{
    		m_HandleThread = CreateThread(NULL,
    				0,
    				entry,
    				(LPVOID)this,
    				0,
    				&m_ThreadID);
    	}
    
    	static DWORD WINAPI entry (LPVOID data) 
    	{
    		Thread* pThread = (Thread*)data;
    		pThread->run();
    		delete pThread;
    		return((DWORD)data);
    	}
    
    	virtual void run () = 0;
    
    	virtual void stop ()
    	{
    		TerminateThread(m_HandleThread, 0);
    		delete this;
    	}
    };
    

    Habe ich damit alle Fehler beseitigt? .



  • Threadmacher schrieb:

    Ah danke für den Hinweis mit Destruktoren.. Wüsste nicht wie ich das mit Destruktor hinbekommen sollte weil klar dass ich einen benutze.

    du musst den thread vergiften. gib ihm ein attrubut bool poisoned; und im thread schau gelegentlich, ob er poisened==true. wenn ja, dann wirf ne exception.

    außerdem fang vielleicht in der entry mit catch(...) alles.



  • Ok danke super tipp! sonst würds oben soweit passen außer halt die exception fangen? 👍



  • Hi!

    Das delete this; in stop() sollte dort nich sein. Aber stop() kannst du durchaus im Destruktor aufrufen.

    grüße



  • TerminateThread aufzurufen ist extrem schlecht. Ersetz das durch etwas vernünftiges.



  • TerminateThread ist ein schlimmer Befehl. Lies mal im MSDN.
    Ein Thread sollte sich immer selbst beenden. Du solltest ihm
    in der stop()-Methode lediglich bescheid sagen, dass er
    nun zum Ende kommen soll.



  • NickHappy schrieb:

    TerminateThread ist ein schlimmer Befehl. Lies mal im MSDN.
    Ein Thread sollte sich immer selbst beenden. Du solltest ihm
    in der stop()-Methode lediglich bescheid sagen, dass er
    nun zum Ende kommen soll.

    jup. und im dtor nochmal zur sicherheit stop() schicken und warten, warten, warten, bis er selber aufgegeben hat.



  • Ok Danke für eure Hinweise! Dann lass ich es jetzt einfach so minimalistisch:

    class Thread
    {
    public:
    	// Handle of the thread
    	HANDLE m_HandleThread;
    	// ID of the thread
    	DWORD  m_ThreadID;	
    
    public:
    	virtual ~Thread () {}
    
    	virtual void start () 
    	{
    		m_HandleThread = CreateThread(NULL,
    				0,
    				entry,
    				(LPVOID)this,
    				0,
    				&m_ThreadID);
    	}
    
    	static DWORD WINAPI entry (LPVOID data) 
    	{
    		Thread* pThread = (Thread*)data;
    		pThread->run();
    		delete pThread;
    		return((DWORD)data);
    	}
    
    	virtual void run () = 0;
    };
    

    Jetzt passts oder? 🙂 (Exception handling brauch ich jetzt nicht)



  • Die Stop Methode war schon richtig, nur sollte sie den Thread nicht stoppen, nur bescheid geben das er sich selbst stoppt.

    Und:

    virtual ~Thread () { stop(); }
    

    grüße


Anmelden zum Antworten