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

问题描述

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("nnn");   //这里即使换行,最后的内容
    printf("输入序号:");   //下面的代码只是模拟其他线程的操作
    int k;
    SetCur(0, 4);  //即使设置光标到第5行,控制台窗口打印出的依然在子线程后面
    scanf("%d", &k);
    char ch = getchar();
  ············
    ············
}

正常执行后这样

输入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("nnn");   //这里即使换行,最后的内容
    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()函数设置光标位置。

解决方案四:

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

时间: 2024-12-22 15:22:37

c语言-C语言写的一个实时时间小程序,用的多线程屏幕问题的相关文章

c语言-用vc6.0编写一个整人的小程序(我想要详细的做法和解除的方法)

问题描述 用vc6.0编写一个整人的小程序(我想要详细的做法和解除的方法) 通过QQ等发给别人,在对面没有编辑环境的情况下也能整到他(比如让他骂自己不然就重启电脑:让他夸我不然锁住计算机屏幕等等!顺便告诉我怎么发给他,在对方打开时候就执行!) 解决方案 编译完之后的exe就可以直接发了吧 解决方案二: 你可以网上找一个相关的批处理文件,比如说隔一段时间把他的电脑的声音关掉等等,然后设置成开机运行就好 解决方案三: 改变VC6.0程序方法.

一个简单的小程序 我一天卖2000

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 请人写了一个简单的小程序,当别人提交了信息之后发送到邮箱,而邮箱是163的,开通了手机邮,也就是说,当用户提交了信息之后手机马上短信通知. 使用的是JMAIL组件.与之不同的是,发送三个邮箱. 还有一个功能就是读取数据库生成一个A4纸大的表格,可以很方便的打出来而不用录入到word.最后就是生成信封,原理同前,只是模板改成了信封. 再加上其他

java代码-我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神

问题描述 我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神 /**在这里贴上我注释满满的代码 求一语道破 求建议 求批评 没有贴main 方法 随便写个main方法便可运行 */ ` package com.subimaga; import java.awt.AWTException; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Cursor; import java.

求救大神,我用android studio开发的项目,删除后能恢复找到不、我写了一个多月的程序

问题描述 求救大神,我用android studio开发的项目,删除后能恢复找到不.我写了一个多月的程序 如题,我写了一个多月的程序,今天不小心点右键删除了项目.请问一下大神有办法恢复没?我在百度上到处找也没有相关的解答.谢谢了啊. 解决方案 试试这个 http://www.xiazaiba.com/html/591.html 个人觉得数据恢复中比较好的

java代码-我用java写了一个简易计算器的程序,但是有时候结果不正确

问题描述 我用java写了一个简易计算器的程序,但是有时候结果不正确 就是有时候计算结果后面会显示很多9或者0 ,比如计算8.3-2.1时,请问大神怎么解决啊? 我是菜菜鸟,程序如下: //Calculator.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame { private JPanel p1=new JPanel();

关于注册安装问题我 我们写了一个管理类的程序 发布了一个安装程序.

问题描述 关于注册安装问题我 我们写了一个管理类的程序 发布了一个安装程序. 关于注册安装问题我 我们写了一个管理类的程序 发布了一个安装程序 刚开始是免费试用7天 但是如果你今天安装了 没到7天 你重新卸载了 再次安装 又有七天了 这个问题该怎么解决呢????. 解决方案 在程序运行的时候往文件系统或者注册表中某个角落写一个值.卸载程序不知道,再次安装,运行后你去判断下,发现有了,就不让用. 还有就是在线验证,将用户信息记录在服务器上.可以用手机短信验证. 解决方案二: 这个有一个就是你安装的

异步-求一个php+jQuery小程序。

问题描述 求一个php+jQuery小程序. php+jQuery实现输入用户id,异步输出数据库中该id的用户信息.最简单的就好! 解决方案 http://jcyzone.iteye.com/blog/1733668 解决方案二: http://www.jb51.net/article/20733.htmhttp://phpway.blog.163.com/blog/static/212112005201301153512311/ 解决方案三: 那不是很容易么..得到id,,发送ajax请求,

c语言-关于字符数组最后一个元素的小问题

问题描述 关于字符数组最后一个元素的小问题 #include main() { char a[5]; scanf("%c%c",&a[1],&a[2]); a[3]='m'; printf("%cn",a[4]); } 运行结果: ab ? 请按任意键继续. . . 请问最后一位难道不应该是随机值吗?为什么输出了"?" 解决方案 ? 应该是不能识别的字符,例如纯英文下输出汉字 可能是凑巧是? 也可能是替换符号, 凡是不能识别的都用

javascript-编写的一个HTML和JavaScripte程序,麻烦看下哪里出了错误

问题描述 编写的一个HTML和JavaScripte程序,麻烦看下哪里出了错误 解决方案 onclick="verfy(document.getElementsByName('a')[0].value)" 解决方案二: onclick="verfy(a.value)" 这行代码不对,你的a是前面那个input的name属性所以a.value是找不到对应的值得,你应该id="a" 然后document.getElementById("a&