Comment créer des threads sur Amiga ?

15 sujets de 1 à 15 (sur un total de 23)

  • 1
  • 2
  • cclecle

      #8957

      je cherche à manipuler les thread en C/C++ sur amiga, j’utilise VBCC comme compilateur et je me demande s’il existe la librairie pthread pour amiga (classic 68k !).

      – Si c’est le cas, ou puis-je la trouver ?

      – Si ce n’est pas le cas, existe-t-il une variante « standard » à tout les système amiga, en passant directement par exec peut être ?

      – Un tuto ?

      Merci d’avance.

      Ciao

      A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
      A1200 + Vampire V2 1200, wb3.1.4.1

      Gilloo

        #137237

        Sur l’amiga 68k, il y a deux types de threads: les tâches (tasks) et les processus (processes). Un processus est une tâche améliorée à la sauce DOS (entrées/sorties, fichiers, timers…)

        Il y a une macro CreateTask(), qui utilise AddTask() d’exec.

        http://www.natami.net/dev/Includes_and_Autodocs_3._guide/node002C.html

        La task ainsi crée ne peut en aucun cas utiliser des fonctions de la dos.library (comme écrire dans un fichier,…) Il faut utiliser CreateProc (ou CreateNewProc dès la v36)

        Après pour synchroniser le tout, il faut envoyer/recevoir des messages ou utiliser Signal() et Wait(). Pour les tutos, n’importe quel code source de device peut t’être utile (vu qu’une unité (unit) est une tâche)

        cclecle

          #137238

          ok merci, je vais tester cela !

          Les sources serons aussi re-compilable pour AOS4 et Morphos sans modifications?

          (En clair es que dos.library est présente dans Morphos et AOS4 ?)

          A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
          A1200 + Vampire V2 1200, wb3.1.4.1

          leo

            #137239

            (En clair es que dos.library est présente dans Morphos et AOS4 ?)

            Oui. MorphOS et OS4 ont les mêmes API que le 3.x qu’ils ont un petit peu étendu, mais toutes les fonctions seront là. Théoriquement, le même code pourra donc se recompiler sur les deux, oui (voir sur AROS) puisque toutes les librairies que tu connais sur 68k sont là.

            Par contre OS4 a rajouté une interface par laquelle tu dois passer pour appeler les fonctions, mais un simple #ifdef OS4 devrait te permettre de régler le problème.

            cclecle

              #137240

              ok merci,

              je vient de tester avec la fonction CreateNewProcTags et j’arrive bien à créer un processus mais dés lors que je fait un printf à l’intérieur de ce processus, j’ai une erreur (défaillance)…

              J’utilise pourtant le code donné en exemple sur gurumed…

              A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
              A1200 + Vampire V2 1200, wb3.1.4.1

              Yomgui

                #137241

                @Leo: attention faut être plus rigoureux: si l’interface change, c’est donc plus la même API… API = Application Programming INTERFACE !


                @cclecle
                :

                Donc non, c’est pas compatible, mais c’est proche. Avec une tonne de macros dégeux on peut y arriver… ou pas! :-D

                Sinon tu donnes quoi comme tags à CreateNewProcTags()?

                Tu compiles avec quelles options pour gcc?

                tu utilises bien ‘-noixemul’ ?

                cclecle

                  #137242

                  voila mon code:

                  #include

                  #include

                  #include

                  #include

                  void MyTask(void);

                  int main(void)

                  {

                  struct Process *MyProcess=NULL;

                  MyProcess=CreateNewProcTags(NP_Entry, MyTask

                  ,NP_Name, « MyProcess »

                  ,NP_Input, Input()

                  ,NP_CloseInput,FALSE

                  ,NP_Output,Output()

                  ,NP_CloseOutput,FALSE

                  ,TAG_DONE);

                  Delay(100);

                  return 0;

                  }

                  void MyTask(void)

                  {

                  printf(« coucoun »);

                  }

                  je compile avec vbcc comme ceci:

                  vc test1.c -lamigas

                  [EDIT]

                  Résolu !!!

                  il fallait « linker » amiga et non amigas !

                  merci quand même !

                  [/EDIT]

                  A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
                  A1200 + Vampire V2 1200, wb3.1.4.1

                  Yomgui

                    #137243

                    cclecle : ah oui autant pour moi, j’ai zappé que tu compiles avec VBCC.

                    Par contre fait vraiment attention au « Delay(100) ».

                    C’est une astuce grade pour ne pas alourdir l’exemple. Mais faut surtout pas faire cela!

                    La tâche parent doit attendre la mort de ses enfants (c’est terrible la vie d’un process…)!

                    Pour être générique, il faut utiliser FindTask() entouré de Forbid()/Permit() pour voir si la tâche enfant existe toujours ou pas.

                    Sous MorphOS, il y a un truc plus cool pour cela: TASKTAG_STARTUPMSG et NP_StartupMsg.

                    La tâche parent donne un message qui sera retourné par Exec quand la tâche est enlevée du système. Donc un Wait()+GetMsg() suffit.

                    Sous OS4 je ne sais pas, demander à Corto ;-)

                    henes

                      #137244

                      La tâche parent doit attendre la mort de ses enfants (c’est terrible la vie d’un process…)!

                      Pour être générique, il faut utiliser FindTask() entouré de Forbid()/Permit() pour voir si la tâche enfant existe toujours ou pas.

                      Du polling régulier ? Ce n’est pas beaucoup mieux que le Delay()…

                      Non, l’unique solution événementielle est que le père attende un message ou un signal que le fils enverra juste avant de quitter.

                      fils :

                      Forbid(); /* sinon le père peut agir avant que le fils quitte complètement; */

                      /*beaucoup de softs ont ce bug et crashent aléatoirement en quittant */

                      ReplyMsg(), PutMsg() ou Signal() vers le père;

                      fin du fils

                      père :

                      Wait() que le fils quitte

                      Le principe est le même sur tous les OS existant.

                      AmiDARK

                        #137245

                        Thread très intéressant :)

                        Je pense qu’un petit exemple de thread pour montrer l’application serait le top pour vraiment finaliser toutes ces explications …

                        Un petit exemple d’un prog qui crée un thread et qui attend le retour de ce thread

                        le thread pourrait être une simple wait() d’une certaine durée et finirait …

                        Ne serait-ce pas sympa pour comprendre ?

                        @+

                        AmiDARK.

                        cclecle

                          #137246

                          @AmiDARK:

                          Lorsque sa marchera je posterai un code fonctionnel pour illustrer tout ça. Cela montre bien le manque de tutoriels clairs à ce sujet. Ou alors ils sont mal indiqués :-(

                          J’ai maintenant un « truc » bizarre, le printf « standard » fonctionne trés bien mais le Printf du ‘dos’ ne fonctionne qu’à moitié.

                          Je m’explique:

                          en compilant bien avec la commande:

                          vc test1.c -lamiga

                          la ligne

                          Printf(« salutn »);

                          donne bien:

                          >salut

                          La ou j’ai un problème c’est avec ce formatage:

                          Printf(« val de i:%dn »,i);

                          donne:

                          >val de i:0

                          Et ce quelque-soit la valeur de i, cela fonctionne pourtant très bien avec le printf standard …

                          A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
                          A1200 + Vampire V2 1200, wb3.1.4.1

                          centaurz

                            #137247

                            Remplace %d par %ld. Historiquement, les fonctions de ce style sur Amiga s’attendent à des arguments 16-bit par défaut, donc il faut préciser que c’est un ‘long’.

                            AmiDARK

                              #137248

                              @cclecle :

                              Cool :)

                              cclecle

                                #137249

                                @centaurz:

                                Merci, c’était effectivement ça ! Mais du coup a qui sert %d si il ne fonctionne pas ? de même %c ne fonctionne pas…

                                Sinon j’avance petit à petit, là je regarde du coté des messages pour les communication inter-process comme l’a conseillé henes.

                                A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
                                A1200 + Vampire V2 1200, wb3.1.4.1

                                Gilloo

                                  #137250

                                  cclecle a écrit :


                                  @centaurz
                                  :

                                  Merci, c’était effectivement ça ! Mais du coup a qui sert %d si il ne fonctionne pas ? de même %c ne fonctionne pas…

                                  Sinon j’avance petit à petit, là je regarde du coté des messages pour les communication inter-process comme l’a conseillé henes.

                                  Le Printf utilise en interne RawDoFmt() et comme ton compilateur a les options int=32bits et pas int=16bits, tout ce qui est mis sur la pile est cadré sur 32bits, donc %ld obligatoire.

                                  Tout est expliqué ici dans le WARNING

                                  http://www.natami.net/dev/Includes_and_Autodocs_3._guide/node0227.html

                                15 sujets de 1 à 15 (sur un total de 23)

                                • 1
                                • 2
                                • Vous devez être connecté pour répondre à ce sujet.

                                Forums AmigaOS, MorphOS et AROS Développement Comment créer des threads sur Amiga ?

                                Amiga Impact