[c] probleme avec les threads

kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   -  
kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

j'ai lu le sujet sur les thread : http://www.siteduzero.com/tutoriel-3-3 [...] es-mutex.html

et je me suis décider a faire un petit programme qui lit un caractere et ensuite déclanche un timer (3=>0). Pendant la décrémentation du timer le programme attend un autre caractere, si l'utilisateur n'en entre pas alors le programme s'arrete avec un "time out" si non on arrete le timer le remet a 3 et on recommence pour un nouveau caractere.

Mais le souci vient du fait que j'entre un caractere le timer ce lance et puis je ne sais plus ecrire de caractere... TIME OUT et fin du programme.

#include <stdio.h> 
#include <stdio.h>ç
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <pthread.h>

#define CMD_SIZE 100
#define TIME_SEC 3

// --------------------------------- Global variables --------------------------------

pthread_t thread_voice_sc;

// ------------------------------ END GLOBAL VARIABLES -------------------------------

// ------------------------------------- STRUCUR -------------------------------------
typedef struct cmd cmd;
struct cmd {
    int n;
    char buffer[CMD_SIZE];
};
// ------------------------------------ END STRUC ------------------------------------

// ------------------------------------ FUNCTIONS ------------------------------------

// Function time scanner
//*
void time_scanner(void){
    int time_a=0, time_n=0, time_out=0;

    time_a = time(NULL);

    while(time_out < TIME_SEC){
        time_n = time(NULL);
        time_out = time_n - time_a;
    }
    pthread_cancel(thread_voice_sc);
    printf("\nTime out !!\n");
}
//*/

// Function voice scanner
//*
void tscanf(cmd *vc_cmd){

    char c = NULL;
    int i;

    for(i=1;i<(*vc_cmd).n;i++){
        c = getch();
        (*vc_cmd).buffer[i] = c;
        printf("%c",c);
    }
    (*vc_cmd).buffer[i] = '\0';


}
//*/

// ---------------------------------- END FUNCTIONS ----------------------------------

int main()
{
    void *ptr = NULL;
    cmd vc_cmd = {CMD_SIZE, NULL};

    while(1){
        printf("> ");
        vc_cmd.buffer[0] = getch();
        printf("%c", vc_cmd.buffer[0]);
        pthread_create(&thread_voice_sc, NULL, tscanf, &vc_cmd); //Lance fonction de scanne
        time_scanner(); // Lance la fonction timer

        printf("Vous avez dit : %s\n\n", vc_cmd.buffer);
    }
    return 0;
}



Je n'arrive pas a comprendre ou est mon erreur.
A voir également:

5 réponses

kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   5
 
up
0
kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   5
 
voila finalement trouvé l'erreur. mais voila que le programme réagi de maniere étrange :

- j'écrit mon 1er mot : marde / mon buffer contient : marde
- j'écrit le 2ieme : MARDE / mon buffer contient : ADrdeMRE

apparament quand je supprime via "pthread_cancel" mon thread ma fonction est mise en pause. Et quand je recrée mon thread il fait une 2ieme instance de cette fonction et exécute ces 2 fonctions chacune leur tour.

est-ce normal ? et comment palier a ce problème ?
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Un problème de pointeur ?
cmd vc_cmd = {CMD_SIZE, NULL};
Le compilateur doit râler, et, si ce n'est pas le cas, il faut le lui demander! En effet tu es entrain de mettre la valeur de buffer à NULL et ce n'est sans doute pas ce que tu voudrais. Je pense que la bonne initialisation est:
cmd vc_cmd = {CMD_SIZE, {0}};
La fonction pthread_cancel supprime le thread (évidemment il faut qu'il existe) et ne le met pas en pause. Mais dans tous les cas il est bon de vérifier la valeur retournée par cette fonction; c'est un bon moyen de vérifier que le programme tourne correctement et, dans ton cas, de pister une anomalie dans ton programme. En aucun cas tu dois avoir 2 threads.

for(i=1; i<(*vc_cmd).n; i++)
Personnellement, je mettrais: i<(*vc_cmd).n-1 en réservant la dernière case pour mettre le '\0' avec: (*vc_cmd).buffer[i+1] = '\0'; mais de toute façon je doute que tu passes souvent par cette ligne de code car il te faut entrer au moins 100 caractères.
Tu ne précises pas ton système d'exploitation, mais tu dois savoir que, sous Linux la fonction 'getchar' ne renvoie un caractère qu'àprès validation de la saisie (retour chariot) à moins de modifier le terminal.
Bonne continuation.
0
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
par pitié, arrétez les écritures:
(*vc_cmd).n
et écrivez
vc_cmd->n
comme les gens qui font du C
0
kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   5
 
J'ai changé mon initialisation de cmd vc_cmd comme tu me la dis ainsi que les (*vc_cmd).n en vc_cmd->n.

J'utilise comme fonction de saisie getch() qui ne demande pas de validation (Touche ENTER) aussi bien sous windows que linux. Pour info je travail sous windows en se moment.

J'ai également fait les testes de retour des fonctions pthread_create et pthread_cancel. Elle retourne toutes 0 ce qui signifie que tout ce passe normalement.

ma chaine contient toujours :
- mot saisi "bonjour" => bonjour
- mot saisi "BONJOUR" => OJUjourBNOR

et elle grandi de plus en plus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kaham Messages postés 180 Date d'inscription   Statut Membre Dernière intervention   5
 
up please.
0