Thread



  • Ich bekomme jetzt die Fehlermeldung:
    Expected initializer before int.

    In der Zeile in der meine main anfängt:

    int main()
    

    Kann mir jemand helfen?



  • Was steht davor? Semikolon vergessen?



  • Oh, ja.
    Vielen Dank.



  • Wie muss das dann aussehen wenn ich das Objekt als Zeiger übergeben will?
    Ich hab es mal so probiert:

    int pthread_create(&thread1, NULL, count,(void*) Player1);
    

    Da kommt aber die Fehlermeldung:
    invalid cast from type ‘player’ to type ‘void*’

    Wie muss man es dann amchen?



  • Rastaman schrieb:

    Wie muss das dann aussehen wenn ich das Objekt als Zeiger übergeben will?
    Ich hab es mal so probiert:

    int pthread_create(&thread1, NULL, count,(void*) Player1);
    

    Da kommt aber die Fehlermeldung:
    invalid cast from type ‘player’ to type ‘void*’

    Wie muss man es dann amchen?

    Naja, Du willst ja vermutlich nicht das Objekt Player1 auf einen void* casten und übergeben, sondern die Adresse des Objekts, oder ? (so funktioniert jedenfalls das pthread_create(), das ich kenne 😉 ).
    Dazu musst Du die Adresse bestimmen und das machst Du mit &:

    ...,(void*) &Player1);
    

    (ach ja: braucht pthread_create() nicht eine Funktionspointer ?? Ist das count ?)

    Gruß,

    Simon2.



  • Wenn das Spiel in C++ ist kannst du auch Boost.Thread benutzen. Das erspart dir die doofen Casts (für die es übrigens auch eine C++ Variante gibt, static_cast oder reinterpret_cast in diesem Fall) und macht das ganze typsicher.

    /edit Und nicht erschrecken, für solch einfache Sachen brauchst du nur die Klasse boost::thread, für die Variablen boost::bind und boost::ref.
    Beispiel:

    boost::thread t (boost::bind (&func, boost::ref (variable));
    // blabla
    t.join ();
    


  • @ Simon2
    So hab ichs probiert, jetzt kommt die Fehlermeldung:
    game.cpp: In function ‘int main()’:
    game.cpp:95: error: initializer expression list treated as compound expression
    game.cpp:95: error: right-hand operand of comma cannot resolve address of overloaded function
    game.cpp:95: error: invalid conversion from ‘void*’ to ‘int’

    Linie 95 ist die in der der thread initializer steht.

    Ich glaub ich probiers mal mit den Boost threads.

    /edit:
    falls jemand doch weiß wie ich das oben genannte Problem lösen kann wärs nicht schlecht.



  • Rastaman schrieb:

    Hallo zusammen.
    Ich habe ein kleines Spiel gemacht, dessen code ich hier leider nicht posten kann da er zu groß ist.
    Ich wil, dass eine Objektvariable immer nach 10 sekunden das ergebnis einer andere mit 10 multipliziert annimmt.
    Ich habe mir gedacht dass könnte man mit einem thread lösen, doch reicht es da wenn ich dass Objekt als parameter übergebe?
    Oder wie kann ich das sonst lösen?

    Danke schonmal.

    Da es sich um ein Spiel handelt gehe ich mal davon aus dass du wohl eine Art Hauptschleife haben wirst, die immer wieder durchlaufen wird, z.B. pro Bildaufbau. Da drinnen fragst du dann einfach die aktuelle Zeit ab, und übernimmst die Werte entsprechend. Dadurch sparst du dir den ganzen Firlefanz mit Threads und Synchronisierung.

    Pseudocode:

    int main()
    {
        while (game_running)
        {
            time = get_time();
            if (time > (last_xxx_time + 10*TICKS_PER_SECOND))
            {
                xxx();
                last_xxx_time = time;
            }
    
            update();
            render();
        }
    }
    

    Das ist auf jeden Fall der "übliche" Weg sowas zu lösen -- für sowas nimmt man doch nicht einen Thread her.



  • Das kenn ich noch nicht, verstehs auch noch nicht ganz aber ich denk ich werd mich da mal ran machen.

    Vielen Dank.

    //Aber was wenn die Haupzschleife für längere Zeit nicht durchlaufen wird?



  • Rastaman schrieb:

    //Aber was wenn die Haupzschleife für längere Zeit nicht durchlaufen wird?

    Man sorgt eben dafür dass genau das nie passiert 😉
    (bzw. dass WENN es passiert es auch egal ist dass dieser "alle 10 Sekunden" Job dann nicht läuft)


Anmelden zum Antworten