Timer event



  • Irgendwie versteh ich das ganze nicht, ich hab die ganzen Boost files und die tu ich einfach in den ordner wo der include path hinzeigt compilier und er meint cannot find lboost_thread ( ld.exe) . Muss ich irgendwie was compilieren ich kann doch die ganzen files nicht zu meinem Projekt hinzufügen , gibt es nicht eine andere weiße das mit den Threads zu machen außer boost wo man nichts hinzufügen muss ?



  • Du sollst die boost-Header nicht in den include-Path kopieren!

    Du must den Inckude-Path so umstellen dass er auch auf die boost-Header zeigt und den Libpath, dass der auch auf die boostLibs zeigt.

    Was für eine IDE hast du eigentlich?



  • Meine ENtwicklungs umgebung ist COde::Blocks und der COmpiler GCC Gnu



  • Win als Platform oder Linux?

    Settings->Compiler&Debugger->Search Directories

    Bei Compiler trägst du das Verzeichniss mit den Headern ein; bei Linker das Verzeichniss mit den Compilierten Libs.



  • 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