IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Pascal / SDL] Problème pour gérer les Threads…


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [Pascal / SDL] Problème pour gérer les Threads…
    Salut à tous !

    Je dois gérer le réseau d'une application Delphi grâce à SDL.

    J'ai commencé par me contenter de SDL_Net, qui permet de créer des sockets, d'envoyer et recevoir des données… bref, tout ce qu'il me fallait à un détail près : la réception ou l'envoi de donnée bloque le reste du programme.

    Incapable de gérer des sockets asynchrones à l'aide de SDL_Net, je me suis tourné vers les threads. Ainsi, j'aimerais avoir un thread à part qui gère l'envoi et la réception de données, et qui communique avec l'application principale grâce à une file. Tout s'est bien passé, ma file dynamique est implémentée, mon application est quasi fonctionnelle… Mais dès que j'ai voulu créer mon premier thread, j'ai rencontré un gros problème !



    Passons donc aux choses sérieuses : mon problème ^^

    Au moment de créer mon thread, j'utilise la fonction SDL_CreateThread qui prend en paramètre la fonction qui doit tourner sur le nouveau thread… Mais en Pascal, la fonction donnée en paramètre est vue comme une valeur, et donc Pascal tente de l'évaluer avant d'effectuer pour de bon la création du thread :-(

    Ainsi, lorsque je fais SDL_CreateThread(mafonction), mafonction est lancée afin que sa valeur soit donnée en paramètre à CreateThread, alors qu'elle devrait être exécutée dans le thread une fois ce dernier créé !

    J'ai essayé de faire un pointeur de fonction, sans succès… J'ai essayé à peu près tout ce qui me passait par la tête… mais je n'arrive toujours pas à ce que la fonction ne se lance que dans le thread nouvellement créé !



    Voici ce que donne la doc SDL : http://www.libsdl.org/cgi/docwiki.cgi/SDL_CreateThread
    Je crois comprendre tout ça, mais c'est du C et ça ne m'aide pas à résoudre mon problème…

    La documentation de JEDI-SDL : http://jedi-sdl.pascalgamedevelopmen...atethread.html n'est pas beaucoup plus complète !

    Je ne trouve que des explications en C, que je comprends (sans vraiment connaitre bcp le C) mais qui ne me permette pas de résoudre mon problème...




    J'aimerais donc savoir si quelqu'un connait suffisamment le Pascal pour m'expliquer comment passer la fonction en argument sans qu'elle soit exécutée trop tôt. Mieux, si quelqu'un a déjà réussi à utiliser SDL_CreateThread en Pascal/Delphi, je veux bien savoir comment !



    J'ai aussi créé une mini-application de test (les sources : http://www.destruxion.net/ftp/snooze/test_threads.zip), ou je voudrais créer deux threads qui tournent pendant 5 secondes en incrémentant/décrémentant un compteur et en affichant sa valeur… Pour l'instant, la fonction du premier thread tourne en boucle infinie, bloquant tout le reste et incrémentant le compteur sans jamais s'arrêter Comme je vous l'ai expliqué, j'ai bien compris les raisons du problème mais je ne trouve pas de solution...


    Je vais m'arrêter là, sinon personne ne va avoir le courage de me lire !
    Si quelqu'un pense pouvoir m'aider, qu'il le fasse Je n'en peux plus de chercher sans réponse… si vous avez d'autres conseils de code à propos de mes sources, elles sont aussi les bienvenues !



    Merci de m'avoir lu !


    Julien Lehuen, alias Sn00ze92.




    PS : Voici le site de l'application pour laquelle je dois réussir à faire le réseau : http://www.destruxion.net Il s'agit d'un jeu vidéo en 2D développé dans le cadre de mes études en première année à l'Épita !

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par Sn00ze92 Voir le message
    J'aimerais donc savoir si quelqu'un connait suffisamment le Pascal pour m'expliquer comment passer la fonction en argument sans qu'elle soit exécutée trop tôt. Mieux, si quelqu'un a déjà réussi à utiliser SDL_CreateThread en Pascal/Delphi, je veux bien savoir comment !
    Je ne connais pas du tout SDL mais j'imagine que SDL_CreateThread attend un pointeur sur la fonction, donc j'opterais pour ce type d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_CreateThread(@mafonction)
    @+ Claudius

  3. #3
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci de m'avoir répondu !

    SDL_CreateThread attend effectivement un pointeur sur la fonction, mais quand j'avais essayé @mafonction ça ne fonctionnait pas ! Un autre membre de mon groupe de projet a trouvé une solution sur un forum en allemand dont j'ai oublié le nom. En tout cas ça a l'air de fonctionner…

    Imaginons que je veux pointer vers cette fonction :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function TMyClass.fthread() : PInt;
    var
        i : integer;
    begin
    	for i := 0 to 10 do
    	begin
    		SDL_MutexP(verrou);
    		writeln('compteur = ', i);
    		SDL_MutexV(verrou);
    		SDL_Delay(200);
    	end;
    	result := nil;
    end;
    // cette fonction ne sert a rien mais cest pour tester les threads :-)

    Premièrement, si la fonction à pointer appartient à une classe (TMyClass pour l'exemple), il vaut mieux créer une fonction "callback" :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function callback(pData : Pointer) : integer; cdecl;
    begin
        TMyClass(pData).fthread();
    end;

    Apparemment le « cdecl » change beaucoup de choses, et je n'ai plus qu'à créer mon thread comem ceci :
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    thread := SDL_CreateThread(@callback, self);


    Je suis encore dans une phase ou je ne comprends pas *complètement* pourquoi ça fonctionne comme ça… mais ça fonctionne !

    S'il y a des intéressés, je peux reposter une archive du "test_threads" qui semble fonctionner…



    Merci à ceux qui m'ont lu, à celui qui m'a répondu… et j'espère que ma micro-explication pourra aider quelqu'un

    Julien Lehuen (Sn00ze92) du Projet Xion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/08/2011, 13h21
  2. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  3. Méthode simple pour gérer les collisions
    Par Hyoga dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/02/2005, 13h43
  4. Réponses: 1
    Dernier message: 17/05/2004, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo