A_FORMAT 2015-08-19 11:25 采纳率: 33.3%
浏览 2996
已采纳

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显示在秒的后面!

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

  • 写回答

4条回答 默认 最新

  • 纵横车 2015-08-19 13:07
    关注
      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;
    }
    

    主要是光标用完要还原。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥15 C# datagridview 栏位进度