Как я могу напечатать две функции одновременно в C? - PullRequest
1 голос
/ 08 декабря 2011

Я играю в C на консольном приложении, и мне нужно напечатать таймер, пока пользователь одновременно играет в игру, я не знаю, как правильно программировать, на самом деле, я просто начинаю использовать этот компилятор, поэтому я Я не знаю много многопоточности и прочее, но это далеко, насколько я понимаю, вот пример двух функций, первая из которых является «таймером», а вторая просто вопрос, мои сомнения если я могу запустить эти 2 функции одновременно и как я могу напечатать таймер, в то время как я могу ответить на эти 2 вопроса, не прерывая работу консоли.

Пример:

#include <windows.h>
#include <stdio.h>
#include <time.h>


DWORD WINAPI Timer(int limit)
{
    int secs = 1;
    time_t unix;

    struct tm * timeinfo;
    time(&unix);
    timeinfo = localtime(&unix);

    int t1 = timeinfo->tm_sec;
    int t2 = timeinfo->tm_sec;
    int i = 0;

    while(1 == 1)
    {
       time(&unix);
       timeinfo = localtime(&unix);
       if((t1 + i)  == timeinfo->tm_sec)
       {
              system("cls");
              printf("time left %d seconds\n", timeinfo->tm_sec - t2 - limit);
              i++;
       }
       if(timeinfo->tm_sec >= (t1 + limit))
       {
            break;
            printf("Your time its done");
       }
    }
    return 0;
}

DWORD WINAPI Questionary()
{
    puts("testing\n\n");

    int age, height;
    printf("Please write your age: ");
    scanf("%d", &age);
    printf("Please write your height: ");
    scanf("%d", &height);
    printf("\n\nThe numbers written are %d y %d", age, height);
    return NULL;
}
int main()
{
    int i, limit;
    HANDLE tempo;
    HANDLE questions;
    DWORD ThreadId;

    printf("\nHow much time would you like for your timer countdown? ");
    scanf("%d", &limit);

    //Funcion Handle
    questions= CreateThread(NULL,0,Questionary,1,0,&ThreadId);
    WaitForSingleObject(preguntas,INFINITE);

    tempo= CreateThread(NULL,0,Timer(limit),1,0,&ThreadId);
    WaitForSingleObject(tiempofinal,limit*40);


    return 0;
}

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Вы можете напечатать вопрос, и вместо ожидания ответа в блокирующем вызове (например, scanf) вы зацикливаетесь при опросе нового ввода и используете Экранирующие коды ANSI , чтобы напечатать время вдругая позиция.

Что-то вроде следующего псевдокода:

print(question)
while (current_time < timer_end)
{
    if (have_input())
        break

    save_current_cursor_position()
    move_cursor_position(x, y)
    print(timer)
    restore_saved_cursor_position()

    very_short_sleep()
}
1 голос
/ 08 декабря 2011

То, что вы хотите с потоками, не может быть достигнуто с помощью линейно-ориентированных функций, что-то вроде ncurses было бы необходимо для многопоточной консольной операции чтения / записи.

То, что написал Йоахим Пилеборг, - ваш лучший шанс,ограничение заключается в том, что ваши часы не могут тикать, пока вы ждете ввода. Если вы будете опрашивать каждую 1 секунду, записывать время, а затем ждать ответа, большинство людей не смогут ответить в течение 1 секунды, поэтому каждые 10секунды, возможно, были бы наиболее разумными.

Альтернативный метод представления времени, помеченного тиковым сигналом каждую секунду, при этом опрашивая каждую секунду, состоял бы в том, чтобы сохранить ввод этой секунды в накопительном буфере и переписать его на экранеследующий входной опрос, кроме тикающего времени.Это может привести к потере некоторых вводимых данных, пока циклы чередуются, и их сложнее кодировать.

В этом случае графический интерфейс лучше подходит для ваших нужд.

YСериал Buena Идея Que Traduzcas Al Inglés TUS NOMBRES переменной Переменные в рамках программы обучения и управления программами, в том числе и мэрией по всему миру.

0 голосов
/ 13 января 2012

Как я знаю, нет возможности писать на консоль из разных потоков одновременно.Хотя кажется, что два потока пишут одновременно, фактически один из них пишет одновременно (который перехватывает консоль для записи).Таким образом, хотя два потока работают одновременно, это не имеет смысла.

Я думаю, что вы можете решить свою проблему как немного сложнее в одном потоке, но это не хорошо.Но я думаю, что вы можете использовать графические компоненты и из двух разных потоков, вы можете установить поле этого компонента, и это удовлетворяет вашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...