probleme mit _beginthreadex



  • mh. also das ganze sieht so aus:

    //header
    class ThreadKlasse {
        public:
            HANDLE hThread;
            bool laufe;
    
            std::string StarteThreadKlasse();
    
            virtual unsigned Run();
    
        protected:
            static unsigned CALLBACK StarteThread(PVOID threadParam);
    };
    
    //source
    std::string ThreadKlasse::StarteThreadKlasse() {
        laufe=true;
    
        // hier hängt er sich weg
        hThread=(HANDLE)_beginthreadex(0,0,StarteThread,this,0,0);
        return "gestartet!";
    }
    
    unsigned ThreadKlasse::Run() {
    }
    
    unsigned CALLBACK ThreadKlasse::StarteThread(PVOID threadParam) {
        ThreadKlasse * instance = (ThreadKlasse *) threadParam;
        return instance->Run();
    }
    

    es stehen natürlich noch mehr vars und funcs drin aber die habe ich jetzt mal weggelassen.
    ich benutze dev-c++ 4.9.9.1 mit gcc 3.3.1.
    und wie gesagt: obiger code compiliert und läuft einwandfrei, nur nicht beim debuggen!
    ich hoffe das sind jetzt genung infos und ihr könnt mir helfen 🙂



  • sn0b schrieb:

    ich benutze dev-c++ 4.9.9.1 mit gcc 3.3.1.
    und wie gesagt: obiger code compiliert und läuft einwandfrei, nur nicht beim debuggen!

    der gdb ist auch nicht so toll. dem kann man nicht immer trauen. nimm z.b. den: http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx



  • der gcc ist doch super.
    warum ist dann der gdb nicht gut?



  • Hast Du Dir die Parameter von _beginthreadex() genau angeschaut? So weit ich weiss, muss man noch einen Pointer auf ein "unsigned int" uebergeben, um die Thread-Id geliefert zu bekommen. Weiss aber nicht, wie die Library von DevC++ das handlet.

    Probier mal verschiedene Debugging-Optionen aus, der C++ Compiler kann verschieden komplexe Debugging-Formate erzeugen. Vielleicht kommt der Debugger bloss nicht mit dem Debugging-Format zurecht.

    Oder aber es liegt wirklich am gdb. Ich hatte auch mal Probleme mit dem Debuggen von Multithread-Anwendungen mit gdb, der ist da naemlich anscheinend etwas unterbelichtet, was das angeht. Offenbar wurde gdb nur fuers Post-Mortem Debugging geschrieben (also, wenn ein Programm abstuerzt und ein Core-Dump schreibt, dass man erst danach gdb aufruft, um den Zustand des Programms zu analysieren und die Fehlerquelle zu finden -- wird aber unter Windows nicht funktionieren, da Windows keine Unix-Core-Dumps schreibt).



  • okay. bin dem link gefolgt und hab mir die Debugging Tools for Windows runtergeladen. hab dann die .exe da reingeladen und ausgeführt. jetzt gehts soweit auch. aber wie überwache ich denn da jetzt ne variable? ich muß eine string-var überwachen. aber ohne source weiß ich ja gar nicht wie und wo. der kann mit den debug infos von gcc auch wohl kaum was anfangen oder? brauche ich jetzt noch vc oder so? das wär ja mist!



  • 1. mach doch mal:

    unsigned threadid;
    hThread=(HANDLE)_beginthreadex(0,0,StarteThread,this,0,&threadid);

    2. deine Run Memberfunktion gibt keinen Wert zurück

    3. poste einen kompletten code, dann kann ich den in visual c++ ausführen und gucken ob der debugger was sagt.

    4. kannst du ja mal deinen compiler und dessen tools updaten. http://www.mingw.org/ => MinGW-3.2.0-rc-3.exe



  • lol. schrieb:

    1. mach doch mal:

    unsigned threadid;
    hThread=(HANDLE)_beginthreadex(0,0,StarteThread,this,0,&threadid);

    hab ich schon längst, hat aber nix geändert.

    lol. schrieb:

    2. deine Run Memberfunktion gibt keinen Wert zurück

    klar tut sie das. das hab ich hier nur weggelassen...

    lol. schrieb:

    4. kannst du ja mal deinen compiler und dessen tools updaten. http://www.mingw.org/ => MinGW-3.2.0-rc-3.exe

    werd ich mal probieren...

    lol. schrieb:

    3. poste einen kompletten code, dann kann ich den in visual c++ ausführen und gucken ob der debugger was sagt.

    wenn 4. nicht klappt komme ich gerne drauf zurück 🙂



  • okay update gemacht, nix hat sich geändert 😞
    kanns auch vielleicht daran liegen:

    This GDB was configured as "i686-pc-mingw32".

    ??
    /edit: hab nen P2 400 das ist doch noch kein i686 oder?

    und naja, wenn ich den kompletten source poste ist das ziemlich viel.
    inclusive aller nötigen dateien sind das dann 15 files... ich müßte auch einiges umstellen/rausnehmen da ich manche sachen nicht posten kann/darf...

    geht das vielleicht noch irgendwie anders?



  • hatte auch nicht damit gerechnet das das update hilft. war nur so als tipp nebenbei. und natürlich solltest du nicht deinen kompletten quelltext posten. der sollte so minimal wie möglich gehalten werden.



  • okay. schon mal danke! wird aber n bisl dauern bis ichs minimiert hab...



  • ich hab den fehler, der mich dazu bewog den debugger zu starten, jetzt gefunden.
    nach wie vor bleibt aber mein problem, daß ich nicht vernünftig debuggen kann.

    @lol.:
    das angebot, meinen code zu posten ist ja lieb gemeint, aber ich kann ja schlecht jedesmal wenn ich mal was zu debuggen hab hier posten...

    was mach ich denn jetzt 😕 😞
    gibts noch nen anderen debugger für gcc?



  • wie siehts denn mit dem code hier aus:

    #include <windows.h>
    #include <process.h>
    #include <iostream>
    
    class Thread
    {
    public:
    	Thread()
    	{
    		unsigned threadIdentifier;
    		_beginthreadex(NULL, 0, ThreadProc, this, 0, &threadIdentifier);
    	}
    private:
    	static unsigned CALLBACK ThreadProc(void* threadArgument)
    	{
    		Thread* pThread = reinterpret_cast<Thread*>(threadArgument);
    		return pThread->run();
    	}
    
    	virtual unsigned run() = 0;
    };
    
    class TestThread : public Thread
    {
    	unsigned run()
    	{
    		for(;;)
    		{
    			std::cout << "Alawalaschabalambaluiblaogalilowampa" << std::endl;
    		}
    		return 0;
    	}
    };
    
    int main()
    {
    	TestThread thread;
    
    	MSG message;
    	while(GetMessage(&message, NULL, 0, 0))
    	{
    		DispatchMessage(&message);
    	}
    }
    

Anmelden zum Antworten