這是一個子程序,我想把這個調試好了加到另一個工程裡,因為要實時顯示時間,所以用到了多線程,現在的問題是子線程執行的時候 光標就移動到這行後面,主線程再打印什麼東西的時候,屏幕顯示就亂套了,怎麼能解決啊,下面是代碼片段。
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顯示在秒的後面!
怎麼能讓他不受子線程的影響
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("\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;
}
主要是光標用完要還原。