Periodi c поток завершается нажатием клавиши escape - PullRequest
0 голосов
/ 20 июня 2020

Я написал следующий код для реализации потока с периодом c, завершающегося, когда кто-то нажимает escape. Результатом является поток с периодом c, который продолжается и после того, как я нажал escape. Подскажите пожалуйста, в чем ошибка? Компилятор компилируется без ошибок и предупреждений. Перед чтением кода перейдите к РЕДАКТИРОВАТЬ ниже.

#include <stdio.h>
#include <pthread.h>
#include <allegro.h>
#include <time.h>
 
void    *task(void *p);
void    time_add_ms(struct timespec *t, int ms);
 
int main()
{
int tret;
int a = 1;
 
    allegro_init();
    install_keyboard();
 
    tret = pthread_create(&tid, NULL, task, (void*)&a);
 
    pthread_join(tid, NULL);
 
    printf("Thread1 returns %d\n", tret);
    allegro_exit();
    return 0;
}
 
 
/* Sommare quantità temporale espressa in ms al tempo nella struttura timespec */
void    time_add_ms(struct timespec *t, int ms)
{
    t->tv_sec += ms / 1000;
    t->tv_nsec += (ms % 1000) * 1000000;
 
    if (t->tv_nsec > 1000000000){
        t->tv_nsec -= 1000000000;
        t->tv_sec += 1;
    }
}
 
/* Funzione da trasformare in task */
void    *task(void *p)
{
struct timespec t;
int period = 100;
int *pi;
char scan = 0;  
 
    clock_gettime(CLOCK_MONOTONIC, &t);
    time_add_ms(&t, period);
    pi = (int *)p;
 
    while (scan != KEY_ESC) {
        if (keypressed()) scan = readkey() >> 8;
        printf("This is TASK %d\n", *pi);
 
        clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
        time_add_ms(&t, period);
    }
}

EDIT: возможно, я обнаружил проблему, когда я нажимаю escape, он печатает символ ^, поэтому компилятор или allegro не распознают ключ es c.

1 Ответ

0 голосов
/ 20 июня 2020

Это не совсем точный поиск ошибки, но я думаю, что это именно то, что вам нужно (подробнее здесь )

Если вы добавите следующий код в свой main(), это отключит канонический режим, который в основном позволит вам получать символы немедленно, не дожидаясь '\ n' или EOF (или коротко введите нажатие клавиши) (уже объяснено в ссылке выше):

#include <termios.h>           
#include <unistd.h>    

int main(){
    static struct termios oldt, newt;
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON);
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);  
    // rest of your code
}

И поток l oop здесь (немного изменил)

while (1) {
    printf("This is TASK %d\n", *pi);
    clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
    time_add_ms(&t, period);
    if(getchar()==27) break;
}
...