C语言写的一个实时时间小程序,用的多线程屏幕问题

这是一个子程序,我想把这个调试好了加到另一个工程里,因为要实时显示时间,所以用到了多线程,现在的问题是子线程执行的时候 光标就移动到这行后面,主线程再打印什么东西的时候,屏幕显示就乱套了,怎么能解决啊,下面是代码片段。

 void real_time(int X,int Y) //显示时间的函数,用到了光标移动函数,X,Y表示坐标
{
    HideCursor(10, 0);  //隐藏光标函数
    hout = GetStdHandle(STD_OUTPUT_HANDLE);
    struct tm *ptr;
    ptr = Time();
    SetCur(X, Y);  //这个函数没贴出,用于移动光标
    printf("%d-%d-%d ", ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday);
    printf("%02d:", ptr->tm_hour);
    printf("%02d:", ptr->tm_min);
    while (1)
    {
        ptr = Time();
        if (ptr->tm_min == 0)
        {
            SetCur(X+10, Y);
            printf("%02d:%02d:%02d", ptr->tm_hour, ptr->tm_min, ptr->tm_sec);
            continue;
        }
        else
        {
            if (ptr->tm_sec == 0)
            {
                SetCur(X+13, Y);
                printf("%02d:%02d", ptr->tm_min, ptr->tm_sec);
                continue;
            }
            else
            {
                SetCur(X+16, Y);   //秒要变化,这里移动光标实现覆盖
                printf("%02d", ptr->tm_sec);
            }
        }
    }
}
 DWORD WINAPI ThreadProc1(LPVOID lpParam)  //子线程
{
    real_time(0,1);  //在第二行打印时间
    return 0;
}
 void main()
{
    system("title 实时时间");
    CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);  //创建线程
    printf("\n\n\n");   //这里即使换行,最后的内容
    printf("输入序号:");   //下面的代码只是模拟其他线程的操作
    int k;
    SetCur(0, 4);  //即使设置光标到第5行,控制台窗口打印出的依然在子线程后面
    scanf("%d", &k);
    char ch = getchar();
  ············
    ············
}

正常执行后这样
正常执行后这样
输入0后,0显示在秒的后面!
输入0后,0显示在秒的后面!

怎么能让他不受子线程的影响

  void real_time(int X,int Y) //显示时间的函数,用到了光标移动函数,X,Y表示坐标
{
    //HideCursor(10, 0);  //隐藏光标函数
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO pt;

    GetConsoleScreenBufferInfo(hout,&pt);   //记录光标位置

    struct tm *ptr;
    time_t lt;
    lt =time(NULL);
    ptr=localtime(&lt);
    SetCur(X, Y);  //这个函数没贴出,用于移动光标
    printf("%d-%d-%d ", ptr->tm_year + 1900, ptr->tm_mon + 1, ptr->tm_mday);
    printf("%02d:", ptr->tm_hour);
    printf("%02d:", ptr->tm_min);

    SetCur(pt.dwCursorPosition.X, pt.dwCursorPosition.Y);   //输出完成后将光标还原

    while (1)
    {
        time_t lt;
        lt =time(NULL);
        ptr=localtime(&lt);

        GetConsoleScreenBufferInfo(hout,&pt);   //记录光标位置

        if (ptr->tm_min == 0)
        {
            SetCur(X+10, Y);
            printf("%02d:%02d:%02d", ptr->tm_hour, ptr->tm_min, ptr->tm_sec);
        }
        else
        {
            if (ptr->tm_sec == 0)
            {
                SetCur(X+13, Y);
                printf("%02d:%02d", ptr->tm_min, ptr->tm_sec);
            }
            else
            {
                SetCur(X+16, Y);   //秒要变化,这里移动光标实现覆盖
                printf("%02d", ptr->tm_sec);
            }
        }
        SetCur(pt.dwCursorPosition.X, pt.dwCursorPosition.Y);   //光标还原
        Sleep(1000);
    }
}
 DWORD WINAPI ThreadProc1(LPVOID lpParam)  //子线程
{
    real_time(0,1);  //在第二行打印时间
    return 0;
}
 int main()
{
    system("title 实时时间");
    printf("\n\n\n");   //这里即使换行,最后的内容
    printf("输入序号:");   //下面的代码只是模拟其他线程的操作
    CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);  //创建线程
    int k;
    //SetCur(0, 4);  //即使设置光标到第5行,控制台窗口打印出的依然在子线程后面
    scanf("%d", &k);
    char ch = getchar();
    return 0;
}

主要是光标用完要还原。

用不着多线程,一个定时器就搞定了。
http://blog.chinaunix.net/uid-20437338-id-1946459.html

可以由SetConsoleCursorPosition()函数设置光标位置。

看下大神们的讲解。。。。。