Forum de la communauté SFML

Aide => Système => Discussion démarrée par: Lolilolight le Juin 04, 2013, 05:03:01 pm

Titre: Classe Clock et les threads.
Posté par: Lolilolight le Juin 04, 2013, 05:03:01 pm
Salut, est ce que la classe clock est synchronisée lorsque l'on utilise plusieurs thread autrement dis, le temps qu'utilise la classe sf::Clock est-il le même dans chaque thread ? (Ou bien est ce différent pour chaque thread ?)

J'ai vu le code de la classe clock mais je ne sais pas du tout ce qu'il signifie, jamais travaillé au sein des os.

Y'a t'il une différence entre le classe Clock de la SFML et la librairie ctime ?

Je pense que je vais plutôt me tourner vers std::thread et std::chrono car j'ai quelques problèmes. :/

PS : J'ai pu lire que la  nouvelle librairie std::thread inclus avec le c++11 semble mieux, j'hésite encore à changer mon code mais je suis tenté de le faire.

Titre: Re : Classe Clock et les threads.
Posté par: Laurent le Juin 04, 2013, 07:07:10 pm
Si tu peux utiliser la lib standard C++11 alors fonce, elle est forcément meilleure que SFML ;)
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 04, 2013, 07:15:49 pm
Ok alors je fonce dès que j'aurai trouvé quelques tutos sur son utilisation.
Titre: Re : Classe Clock et les threads.
Posté par: Eroy le Juin 04, 2013, 09:10:06 pm
Sauf qu'elle est pas encore utilisable...
La dernière foi que j'ai essayé je me suis aperçut que serte les .h étaient complets mais que rien était implémenté... Alors oui tu peux instancier un thread... mais voilà.
Titre: Re : Classe Clock et les threads.
Posté par: Laurent le Juin 04, 2013, 09:22:37 pm
Avec quel compilateur ?
Titre: Re : Classe Clock et les threads.
Posté par: Eroy le Juin 04, 2013, 11:33:47 pm
En fait jviens de voir que chuis plus à la bourre que je pensais, j'ai la 472 (donc de fin septembre) ça a dût être intégré depuis va falloir que je regarde les logs pour passer std::thread si c'est possible maintenant...

Mais ce qui m'avait surpris c'est que j'utilise en gros tout ce que propose c++11 et c'était le seul truc qui était annoncé comme incomplet totalement inutilisable. Mais vu qu'on est maintenant à la 381 ça doit être bon. ^^
(et j'espère qu'ils en ont profité pour réparer leurs conneries avec les maps)

edit: d'après les status ça a l'air supporté, par contre c'est toujours très incomplet et ya toujours pas les futures malheureusement. :/
Titre: Re : Classe Clock et les threads.
Posté par: Laurent le Juin 05, 2013, 08:00:21 am
Citer
j'ai la 472
Citer
Mais vu qu'on est maintenant à la 381
Mais tu parles de quoi là ? :P
Titre: Re : Classe Clock et les threads.
Posté par: Eroy le Juin 05, 2013, 09:09:51 am
Rien jmélange les versions de différents trucs, spas grave.  ;D
Titre: Re : Classe Clock et les threads.
Posté par: Laurent le Juin 05, 2013, 09:14:21 am
Ce serait quand même bénéfique à la discussion si on savait de quel compilateur tu parles :P
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 05, 2013, 10:28:35 am
Moi j'ai téléchargé la 4.8 de mingw mais je dois installer une version plus récente de Qt car avec la version 4.7 de Qt ça ne marche pas j'ai des erreurs de ce genre.

Citer
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|217|warning: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wliteral-suffix]|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp||In constructor 'ChooseFactionWidget::ChooseFactionWidget(MyFrame*)':|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|23|error: unable to find string literal operator 'operator"" __FILE__'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|214|note: in definition of macro 'QTOSTRING_HELPER'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|217|note: in expansion of macro 'QTOSTRING'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|220|note: in expansion of macro 'QLOCATION'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|23|note: in expansion of macro 'SIGNAL'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|23|error: unable to find string literal operator 'operator"" __FILE__'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|214|note: in definition of macro 'QTOSTRING_HELPER'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|217|note: in expansion of macro 'QTOSTRING'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|219|note: in expansion of macro 'QLOCATION'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|23|note: in expansion of macro 'SLOT'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|24|error: unable to find string literal operator 'operator"" __FILE__'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|214|note: in definition of macro 'QTOSTRING_HELPER'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|217|note: in expansion of macro 'QTOSTRING'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|220|note: in expansion of macro 'QLOCATION'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|24|note: in expansion of macro 'SIGNAL'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|24|error: unable to find string literal operator 'operator"" __FILE__'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|214|note: in definition of macro 'QTOSTRING_HELPER'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|217|note: in expansion of macro 'QTOSTRING'|
C:\Qt\2010.05\qt\include\QtCore\..\..\src\corelib\kernel\qobjectdefs.h|219|note: in expansion of macro 'QLOCATION'|
D:\Projets-c++\Sorrok\GraphicEngine\chooseFactionWidget.cpp|24|note: in expansion of macro 'SLOT'|
||=== Build finished: 4 errors, 1 warnings (0 minutes, 20 seconds) ===|

Je devrai recompiler Qt pour le support du plugin pour le driver mysql, rhalalalala...
Titre: Re : Classe Clock et les threads.
Posté par: Eroy le Juin 05, 2013, 12:35:07 pm
je l'ai pas précisé mais je parle de gcc et donc 381 = 4.8.1 ^^
Je suis tellement habitué à utilisé uniquement celui-là que j'ai oublié que yen avait d'autres. :p

En regardant les changes je ne vois rien à ce qui concerne les threads même pour la version 4.9 à venir. :/

Voilà ce que je me tape avec gcc 4.7.2 en tout cas :
error: 'std::this_thread' has not been declared
error: 'thread' is not a member of 'std'
(avec cet exemple : http://en.cppreference.com/w/cpp/thread/thread/thread)
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 05, 2013, 01:40:08 pm
Ha, ok je vais essayer, j'ai installer une version plus recente de Qt et je n'ai plus cet erreur par contre j'ai un plantage de la commande moc avec VS2012 donc je ne sais plus générer mes .moc, je vais essayer avec la version 32bits de Qt.
Je sais que j'ai eu vent que ce n'était pas encore au point partout la 64 bits au niveau développement.
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 05, 2013, 01:45:11 pm
Bon bah je viens de tester tout sans Qt ni sfml ni rien, juste avec l'exemple dans le lien que tu m'a donné :
#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>

void f1(int n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread " << n << " executing\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

void f2(int& n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread 2 executing\n";
        ++n;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main()
{
    int n = 0;
    std::thread t1; // t1 is not a thread
    std::thread t2(f1, n + 1); // pass by value
    std::thread t3(f2, std::ref(n)); // pass by reference
    std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread
    t2.join();
    t4.join();
    std::cout << "Final value of n is " << n << '\n';
}
 

Bah chez moi ça tourne!
Bon j'espère que mon projet va moins laguer avec ça, mais avant tout il faut que j'arrive à réinstaller QT.
Titre: Re : Classe Clock et les threads.
Posté par: Eroy le Juin 05, 2013, 04:27:56 pm
Ok, ça a donc dût être mis à jour depuis, c'est cool faudra que je recode quelques trucs avec. :3

Par contre loli, bon j'ai l'impression de me répéter à chaque foi mais... Ton problème vient pas de ce que tu utilises... Quelque soit la lib c'est assez optimisé pour que tu ne vois aucune différence entre l'une ou l'autre... C'est pas en passant de sfml à std pour les threads que tu verras la différence.
C'est comme un joueur de tennis pro qui te dira que ya une énorme différence entre une balle de grande surface et la marque officielle qu'il utilise...

donc :
Citer
j'espère que mon projet va moins laguer avec ça
Non !
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 05, 2013, 05:17:36 pm
Erf ok, mais ça ne marche que en 64 bits là le c++11.

Je pense aussi que ça ne réglera pas le bug mais bon..., je vais toujours essayer.
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 05, 2013, 06:39:39 pm
Bon tt pis je laisse tombé le c++11 sinon ça ne sera pas compatible avec les plateformes 32 bits de plus j'ai des problème à la compilation de Qt5 il ne trouve pas les libs hors que je les ai renseigné exactement comme je l'ai fait avec la version 4.7 de Qt de plus quand je veux exécuter ça m'affiche un message d'erreur comme quoi ça peut pas s'exécuter car incompatibilité avec windows 64 bits.

Je reviens donc à mon ancienne config de toute façon il y a 1 chance sur 100 que ça résoudrait mon problème, je devrai tout simplement trouver une solution plus tard au niveau du code pour que ça donne moins cette impression que ça lag. (Parce que ça lag pas vraiment c'est juste que y'a une différence avec une distance de 30 quand même entre les positions que je reçois à chaque mise à jour et les positions que j'estime côté client..., et j'ai du mal à trouver une solution pour gommer ça.
Titre: Re : Classe Clock et les threads.
Posté par: Lolilolight le Juin 08, 2013, 09:20:41 am
Voila j'ai résolu le problème simplement en changeant ça :
Vec2f newPos = oldPos + (nextPos - oldPos) / actionTime.asSeconds() * elapsedCarTime.asSeconds()
Par ça :
Vec2f newPos = oldPos + (nextPos - oldPos) / actionTime.asSeconds() * (elapsedCarTime.asSeconds() * 0.7f);

J'ai l'impression que les sf::clock ne sont pas tout à fait exact quand on lance plusieurs applications en même temps, en tout cas j'ai du réduire la vitesse du perso côté client sinon il était toujours devant la position qu'il a sur le serveur à chaque mise à jour.
Maintenant, c'est déjà beaucoup plus fluide!