Thread Problem



  • Hallo!

    Ich beschäftige mich gerade mit den verwenden von Threads. Habe dazu auch ein gutes Beispiel in der online Buchversion von VC6.0 in 21 Tagen gefunden. Leider hat der demo source einen fehler, hab aber leider nicht den blasen schimmer worans liegt.
    Bitte um eure Hilfe, da ich das mit den Threads endlich kapieren will.

    Link zur online version: http://www.wasistphase.de/vc6/inhalt.htm

    Hier ein auszug aus meiler doc-klasse:

    class CTaskingDoc : public CDocument
    {
    protected: // Nur aus Serialisierung erzeugen
    	CTaskingDoc();
    	DECLARE_DYNCREATE(CTaskingDoc)
    
    // Attribute
    public:
    private:
    	CSpinner m_cSpin[4];
    	CWinThread* m_pSpinThread[2];
    	//CWinThread* m_pSpin1Thread;
    	//CWinThread* m_pSpin2Thread;
    
    // Operationen
    public:
    	void DoSpin(int iIndex);
    
        static void SuspendSpinner(int nIndex, BOOL bSuspend);
    
    private:
    	void CalcPoint(int nID, CSpinner *pSpin);
    
    	void InitSpinners();
    
    	UINT ThreadFunc(LPVOID pParam);
    

    Hier die Function wo der compiler schreit:

    void CTaskingDoc::SuspendSpinner(int nIndex, BOOL bSuspend)
    {
    	// Thread anhalten?
    	if (!bSuspend)
    	{
    		// Ist Zeiger für den Thread gültig?
    		if (m_pSpinThread[nIndex])
    		{
    			// Handle für den Thread holen
    			HANDLE hThread = &m_pSpinThread[nIndex]->m_hThread;
    
    			// Auf Absterben des Threads warten
    			::WaitForSingleObject (hThread, INFINITE);
    		}
    	}
        else // Thread laufen lassen
    	{
    		int iSpnr;
    		// Welchen Fächer verwenden?
    		switch (nIndex)
    		{
    			case 0:
    				iSpnr = 1;
    			break;
    			case 1:
    				iSpnr = 3;
    			break;
    		}
    
    		// Thread starten, Zeiger auf Fächer übergeben
    		m_pSpinThread[nIndex] = AfxBeginThread(ThreadFunc, (LPVOID)&m_cSpin[1]);
    	}
    
    }
    

    Und hier meine Fehlermeldungen:
    :\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(208) : error C2597: Ungueltige Referenz auf ein Datenelement 'CTaskingDoc::m_pSpinThread' in einer statischen Member-Funktion
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(208) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(211) : error C2597: Ungueltige Referenz auf ein Datenelement 'CTaskingDoc::m_pSpinThread' in einer statischen Member-Funktion
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(211) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(211) : error C2227: Der linke Teil von '->m_hThread' muss auf Klasse/Struktur/Union zeigen
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2597: Ungueltige Referenz auf ein Datenelement 'CTaskingDoc::m_pSpinThread' in einer statischen Member-Funktion
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2597: Ungueltige Referenz auf ein Datenelement 'CTaskingDoc::m_cSpin' in einer statischen Member-Funktion
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2102: '&' erwartet L-Wert
    C:\Projekte\Fa Smart\Testprojects\tasking\taskingDoc.cpp(232) : error C2665: 'AfxBeginThread' : Durch keine der 2 Ueberladungen kann Parameter 1 vom Typ 'unsigned int (__thiscall CTaskingDoc::*)(void *)' konvertiert werden
    Generieren von Code...
    Ueberspringen... (keine relevanten Aenderungen gefunden)
    taskingView.cpp
    Fehler beim Ausführen von cl.exe.

    tasking.exe - 11 Fehler, 2 Warnung(en)

    Danke
    Michael



  • bringt uns nix.
    also wenn dann brauch ich den ganzen quellcode, damit ich ihn selber compilieren kann oder die zeilen, wo der fehler auftritt.

    Esco



  • Michael1 schrieb:

    class CTaskingDoc : public CDocument
    {
    protected: // Nur aus Serialisierung erzeugen
    	CTaskingDoc();
    	DECLARE_DYNCREATE(CTaskingDoc)
    
    // Attribute
    public:
    private:
    	CSpinner m_cSpin[4];
    	CWinThread* m_pSpinThread[2];
    	//CWinThread* m_pSpin1Thread;
    	//CWinThread* m_pSpin2Thread;
    
    // Operationen
    public:
    	void DoSpin(int iIndex);
    
        static void SuspendSpinner(int nIndex, BOOL bSuspend);
        ^^^^^^-> muss entfernt werden !
    private:
    	void CalcPoint(int nID, CSpinner *pSpin);
    
    	void InitSpinners();
    
    	static UINT ThreadFunc(LPVOID pParam);
        ^^^^^^-> muss hinzugefügt werden !
    

    Hier die Function wo der compiler schreit:

    void CTaskingDoc::SuspendSpinner(int nIndex, BOOL bSuspend)
    {
    	// Thread anhalten?
    	if (!bSuspend)
    	{
    		// Ist Zeiger für den Thread gültig?
    		if (m_pSpinThread[nIndex])
    		{
    			// Handle für den Thread holen
    			HANDLE hThread = &m_pSpinThread[nIndex]->m_hThread;
    			                 ^-> muss weg!
    			// Auf Absterben des Threads warten
    			::WaitForSingleObject (hThread, INFINITE);
    		}
    	}
        else // Thread laufen lassen
    	{
    		int iSpnr;
    		// Welchen Fächer verwenden?
    		switch (nIndex)
    		{
    			case 0:
    				iSpnr = 1;
    			break;
    			case 1:
    				iSpnr = 3;
    			break;
    		}
    	
    		// Thread starten, Zeiger auf Fächer übergeben
    		m_pSpinThread[nIndex] = AfxBeginThread(ThreadFunc, (LPVOID)&m_cSpin[1]);
                                                                                ^-> iSpnr anstatt 1!
    	}
    
    }
    

    Die Änderungen sollten die bisherigen Fehlermeldungen verbannen.

    Gruss
    EB



  • hi,
    nachdem ich mich auch ziemlich lange mit threads und problemen rumgeschlagen habe (wenn du das problem in den griff bekommen hast tritt wahrscheinlich direkt das nächste auf), hier mal zwei links, dort findest du jeweils zwei beispiele (funktionieren) angehängt, die einmal das starten eines threads (übergibt einen handle) demonstriert, gleichzeitig wird aus dem thread auf das dialogfenster zugegriffen (ist wohl bei der übergabe eines zeigers nichr "sicher"),

    das andere beispiel zeigt wie du aus einem thread auf variablen einen dialogs zugreifen kannst (über postmessage und return wert einer memberfunktion)
    mir hats sehr geholfen
    Harald

    http://www.codeguru.com/forum/showthread.php?t=332914

    http://www.codeguru.com/forum/showthread.php?t=328382



  • Hallo !

    Suppa Danke für Euere Hilfe!

    @EarlayBird Danke werd´s gleich mal ausbrobieren.
    @YouCanCallMeAl Danke auch Dir, is schön zu wissen das man sich nicht nur alleine mit den Threads herrumärgert 🙂

    @Esco, falls Du das Bsp. mahl selbst ausprobieren willst findest Du es unter den oben von mir gennanten Link, www.wasistphase.de/vc6/inhalt.htm Siehe unter Woche3, Tag-18 Multitasking. Dort findest du das gesamte demo Project.

    Gruss
    Michael1



  • Hallo nochmal!

    Hab jetz die Änderungen von EarlyBird probiert. Jetz Funktioniert´s 😃 , Danke nochmal! Werd mir jetz mahl die Bsp. von youCanCallMeAl und der MFC-FAQ anschauen.

    Gruss
    Michael1


Anmelden zum Antworten