Comment créer des threads sur Amiga ?
15 sujets de 1 à 15 (sur un total de 23)
- 1
- 2
-
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.1Sur 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)
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(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.
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@Leo: attention faut être plus rigoureux: si l’interface change, c’est donc plus la même API… API = Application Programming INTERFACE !
Donc non, c’est pas compatible, mais c’est proche. Avec une tonne de macros dégeux on peut y arriver… ou pas!
Sinon tu donnes quoi comme tags à CreateNewProcTags()?
Tu compiles avec quelles options pour gcc?
tu utilises bien ‘-noixemul’ ?
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.1cclecle : 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
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.
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.
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.1Merci, 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.1cclecle a écrit :
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 ?