程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-C語言寫的一個實時時間小程序,用的多線程屏幕問題

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("\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;
}

主要是光標用完要還原。

a1193561652
A_FORMAT
a1193561652
A_FORMAT
A_FORMAT
A_FORMAT
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved