Threads

Après avoir obtenu un serveur fonctionnel, il nous fallait l’implémenter directement dans la simulation pour que cette dernière le lance et l’utilise pour récupérer les données envoyées par l’application Java.

Pour pouvoir utiliser notre serveur directement avec la simulation et sans devoir le lancer manuellement à côté, il nous a fallu trouver une solution. En l’incluant simplement dans le code de la simulation,le serveur bloque cette dernière. Il la bloque car en l’incluant directement dans le code, le programme reste sur le serveur et son exécution. La suite de la simulation n’est pas exécutée.

Nous avons donc cherché une solution et avons choisis d’utiliser les threads. Ces derniers permettent l'exécution de plusieurs tâches en parallèle et sont simples à utiliser.

Un thread est un processus dit léger. Pour le comprendre il faut s'imaginer que chaque processus exécuté possède sa propre « mémoire virtuelle ». La mémoire virtuelle est un principe qui a été inventé dans les années 60 et qui consiste à associer la mémoire vive de l'ordinateur à l'espace temporaire du disque dur. Hors dans le cas des threads, ce sont plusieurs processus qui partage la même mémoire allouée.  

Schéma thread :
Voici un petit schéma pour aider à la compréhension. On peut clairement y voir le rond représentant la « mémoire virtuelle » et les divers threads (processus léger). Ces derniers utilisent tout les deux la même mémoire virtuelle, celle du processus qui a lancé les threads.

Dans notre cas précis, il a suffit de lier le serveur à la simulation en incluant le fichier ".h" lié à notre serveur. Ensuite nous avons créé un thread contenant la fonction main du serveur. Pour pouvoir utiliser le thread, il faut tout d'abord le créer avec cette fonction :

pthread_t objetThreadServeur;

Cette ligne crée un objet de type pthread_t, c’est à dire un thread. Ensuite nous allons la lié à une fonction avec ceci :

pthread_create(&objetThreadServeur, NULL, threadServeur, (void*)NULL);

Cette fonction lie notre thread à une fonction à exécuter, dans notre cas la fonction s'appelle threadServeur et lance la fonction main du serveur. Le serveur est donc bien lancé en parallèle de notre simulation.

Pour finir correctement la jonction de notre simulation et du serveur, il a fallu rajouter un dernier thread. Il a pour but de lire en continu un tableau de caractère contenant les instructions récupérées par le serveur. Pour cela on utilise les mêmes fonctions que celles qui sont expliquées ci-dessus à une exception près. Nous ne lançons pas le main du serveur, mais une autre fonction qui a pour but de remplir le tableau de caractères.

C'est à ce moment là malheureusement que nous avons une erreur que nous n'avons pas réussi à corriger. Le lancement du thread de récupération des données fait quitter l’application d'un seul coup.