thread problem



  • typedef unsigned (__stdcall *PTHREAD_START) (void *);
    #define libCreateThread(psa, cbStack, pfnStartAddr,  \
                pvParam, fdwCreate, pdwThreadID) \
                ((HANDLE) _beginthreadex(    \
                (void *) (psa),          \
                (unsigned) (cbStack),        \
                (PTHREAD_START) (pfnStartAddr),  \
                (void *) (pvParam),      \
                (unsigned) (fdwCreate),      \
                (unsigned *) (pdwThreadID)))
    
    typedef list<ServerSocket*> SERVERLIST;
    
    class ServerSocket
    {
       public:
          void run();
    };
    
    class Wrapper
    {
       public:
          bool start();
    
       protected:
          static void startThread(LPVOID lpvoid);
    
       private:
          SERVERLIST _ServerHandles;        
    }
    
    bool Wrapper::start()
    {
       HANDLE hThread = NULL;
       DWORD dwid = 0;
       bool retVal = false;
       SERVERLIST::iterator iter;   
    
       iter = _ServerHandles.begin();       
    
       while(iter != _ServerHandles.end())
       {    
          /* vorher
          hThread = libCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(*iter)->run(), NULL, 0, &dwid);
          hatte funktioniert!!!
          */            
          hThread = libCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)startThread, (LPVOID)(*iter), 0, &dwid);
          if(hThread) 
          {
             printf("Server launched! Thread ID = %04x launched\n", dwid);
         CloseHandle(hThread);
          }
          ++iter;
       }
    
       return retVal;
    }
    
    void Wrapper::startThread(LPVOID lpvoid)
    {   
       ServerSocket* server = (ServerSocket*)lpvoid;
    
       EnterCriticalSection(&csThread);
    
       if(++_threadsStarted >= _maxThreadsAllowed)
       {                
          --_threadsStarted;
          LeaveCriticalSection(&csThread);
          return;
       }    
       LeaveCriticalSection(&csThread);
    
       server->run();
    
       EnterCriticalSection(&csThread);
       --_threadsStarted;
       LeaveCriticalSection(&csThread);
    }
    

    hi.

    in _ServerHandles befindet sich zwei Einträge.
    Wieso wird startThread niemals aufgerufen??



  • jemand ne Idee?



  • man warte doch mal ab, is doch erst 30 minuten seit der fragestellung her. damit machst du dich unbeliebt :o



  • sorry



  • hab grad was rausgefunden...

    hThread = libCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(*iter)->run(), NULL, 0, &dwid);

    funzt auch nid.. wurde getäuscht, da (*iter)->run() direkt ausgeführt wird...

    und libCreateThread somit wartet, bevor es gestartet wird, bis run() beendet wurde!

    ???????????



  • nochwas...
    wenn ich einen thread ausserhalb der klasse starte, funzt es prima!



  • was ich auch nicht kapier...
    libCreadThread wird ganznormal ausgeführt...
    es returned nämlich nicht 0



  • es wird unheimlicher...

    wenn ich einen rebuild mache, wird threadStart beim ersten neuen Ausführen gestartet... bei jedem weiteren start, wird es nicht mehr ausgeführt!!!

    HILFE!!!!!!!!!



  • hat sich erledigt!
    war dumm!
    danke für eure Mühen! 😉



  • An was lag es, bei Threads hat so manch meiner Programme auch scheiße gemacht.
    Ist csThread global?

    [ Dieser Beitrag wurde am 06.01.2003 um 12:32 Uhr von Nitromaus editiert. ]



  • nö, ist private...

    ich war dumm, und es war spät.

    die threads wurden gestartet, doch bevor sie richtig da waren, war das haupt programm schon zu ende - hab ich mir ne message queue gebastelt, mit der ich warten kann, bis alle threads zu ende sind...

    war ein wenig verwirrt! *hehe*


Anmelden zum Antworten