如何在C中同时打印两个功能?

时间:2011-12-08 18:58:17

标签: c multithreading printf

我在控制台应用程序上用C做游戏,我需要在用户同时玩游戏时打印一个计时器,我不知道如何编程那么好,实际上我只是开始使用这个编译器所以我不知道很多多线程和东西,但这是我得到的,这是两个函数的例子,第一个是“计时器”,第二个只是一些问题, 我怀疑如果我可以同时运行这两个功能,以及如何打印计时器,而我可以在不中断控制台的情况下回答这两个问题。

实施例

#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 个答案:

答案 0 :(得分:3)

您可以打印问题,而不是等待阻止调用中的答案(如scanf),您在轮询新输入时循环,并使用ANSI escape codes在另一个位置打印时间

类似下面的伪代码:

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 :(得分:1)

使用线程导向的函数无法实现线程的所需,对多线程控制台读/写操作来说,ncurses就是必需的。

Joachim Pileborg写的是你最好的机会,限制是你等待输入时你的时钟不能滴答作响。如果你每1秒轮询一次,写下时间然后等待答案,大多数人将无法在1秒内回复,因此每10秒钟可能是最明智的。

在每秒仍然轮询的同时每秒显示时间滴答的另一种方法是将该秒的输入保存在累积缓冲区上,并在下一次输入轮询时在屏幕上重写它,除了时间滴答。这确实存在在循环交替时丢失一些输入并且编码更复杂的危险。

这种情况下,图形界面更适合您的需求。

Y seria buena idea que traduzcasalingléstusnombres de variables para ayudar aunamásrápidacomprensióndelcontenido de tu programa,ya que es lo que entiendelamayoríapacá。

答案 2 :(得分:0)

据我所知,无法同时从不同的线程写入控制台。它看起来两个线程正在同时写入,实际上其中一个是一次写入(其中一个是抓住控制台写的)。通过这种方式,两个线程同时运行,它没有意义。

我认为你可以在一个帖子中解决你的问题,但这并不是一件好事。但我认为你可以gui组件,从两个不同的线程,你可以设置这个组件的字段,这满足你的要求。