问题描述
- 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(); ············ ············ }
怎么能让他不受子线程的影响
解决方案
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(<);
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(<);
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