Timer event



  • Linking console executable: ..\bin\console.exe
    ..\bin\.objs\src\World\Bo.o:Bo.cpp:(.text+0xf0b): undefined reference to boost::thread::thread(boost::function0<void, std::allocator<boost::function_base> > const&)' ..\\bin\\.objs\\src\\World\\Bo.o:Bo.cpp:(.text+0xfb3): undefined reference toboost::thread::~thread()'
    ..\bin\.objs\src\World\Bo.o:Bo.cpp:(.text+0x1092): undefined reference to `boost::thread::~thread()'

    http://www.imagehack.eu/de/uploads/9b11c79c61.jpg

    Operating System is WIndows



  • Toa schrieb:

    void foo()
    {
    	int var;
             var + 5 ;
    sleep (10 min);
    var - 5 ;
    }
    

    wuerde das so klappen ?

    Wenn ich mir das so ansehe, solltest du dir vielleicht eher noch mal die Grundlagen anschauen...?



  • Ja lol , das is "Pseudo COde" Also nur Programm Logik kein ausführbarer COde xD



  • Aso, ok 😃



  • timeSetEvent() sag ich mal



  • Bringt nichts wenn man keine Event-Queue hat.

    Sonst ist was in die Richtung natürlich geeignet.



  • Also ich mach das ganze nun so und das klappt auch :

    //main
    DWORD    threadId;
    HANDLE    threadHandle;
    
    threadHandle =CreateThread(NULL, 0,  ThreadProc, NULL, 0, &threadId);
    

    und hier der thread

    DWORD WINAPI ThreadProc(LPVOID lpParam)
    {
      //Sleep(60000);
      Sleep(40000);
    
    }
    

    jetzt noch eine kleine Frage wie kann ich dem Thread diesen Zeiger Übergeben sPlayer *wPlayer ?

    Also eigentlich müsste man den Thread doch dann so aufrufen :

    threadHandle =CreateThread(NULL, 0,  ThreadProc, wPlayer, 0, &threadId);
    

    aber was muss in die signatur von DWORD WINAPI ThreadProc(LPVOID lpParam) )

    weil DWORD WINAPI kann man ja nur einen Void Pointer übergeben Sad
    wie mach ich das denn nun ??



  • Du castest den Player-Zeiger einfach auf einen void-Zeiger. In der Thread-Funktion castest du wieder zurück... Der void-Zeiger ist ja quasi nur ein Platzhalter, "void" ist schließlich kein Typ.



  • Okay wie war das noch mal

    wenn ich einen sPlayer *wPlayer Zeiger umcasten will dann

    void *voidPtr;
    
    voidPtr = wPlayer;        
    wPlayer = (int *)voidPtr; 
    threadHandle =CreateThread(NULL, 0,  ThreadProc, voidPtr, 0, &threadId);
    

    und der thread :

    DWORD WINAPI ThreadProc(LPVOID voidPtr)
    

    aber bei mir kommt der fehler cannot convert int* to sPlayer* in assigment



  • Da mußt du auch den richtigen Cast verwenden - und die Umwandlung deines sPlayer in einen int nützt dir gar nichts:

    void *voidPtr;
    
    voidPtr = wPlayer;        
    wPlayer = (sPlayer *)voidPtr;
    

    btw solltest du die Rück-Umwandlung IN der Thread-Funktion durchführen:

    DWORD WINAPI ThreadProc(LPVOID voidPtr)
    {
      sPlayer* object = (sPlayer*) voidPtr;
      ...//arbeite mit *object
    }
    


  • Du machst es dir etwas zu kompliziert 😃 (edit: damit meine ich natürlich nicht CStoll))

    threadHandle =CreateThread(NULL, 0,  ThreadProc, (void*)wPlayer, 0, &threadId);
    
    DWORD WINAPI ThreadProc(LPVOID voidPtr)
    {
        sPlayer* wPlayer = (sPlayer*) voidPtr;
    }
    

    oder aber, weil der Code oben teuflisch böse und fehleranfällig ist, nutze reinterpret_cast<void>(wPlayer)* bzw reinterpret_cast<sPlayer>(voidPtr)* 🙂

    edit2: Wow, da war ich 1 (in Worten: eine) Sekunde zu langsam 😕



  • Thx habs 🙂 .. Klappt alles wunderbar ..


Anmelden zum Antworten