2012-08-02 97 views
2

我想在linux gcc上編寫一個C++程序,這樣一種方式應該在右上方顯示時間(不斷變化)並讓其他進程繼續。C++程序使時間顯示在背景上持續顯示

例如:

我想顯示在右上角的時間,也希望在同一屏幕上進行,如基本Calcs(計算)的一些操作...

。我知道汽車無使用這個片段

#include<iostream.h> 
int main() 
{ 
while(1) 
{ 
system("clear"); 
system("date +%r&"); 
sleep(1); 
} 
return 0; 
} 

但每一次, 1顯示時間),它清除了屏幕,因此屏幕上的其它指令也被清除 2)我也想知道如何使兩個進程同時運行?

使用bg等會有幫助嗎?

+0

要在程序中同時做其他的事情,將兩個任務分成單獨的線程。如果您擁有最新的編譯器,則可以使用pthread或C++ 11的內置線程功能。你應該能夠在網上找到大量的這些信息和指南。 – Michael 2012-08-02 15:11:56

回答

2

有兩個部分給你的問題。

第一部分:如何在不中斷屏幕上的其他輸出的情況下在固定位置輸出時間。

低層次方案:

高級方法:使用基於文本的UI庫,如curses/ncurses


第二部分:如何更新與其他活動並行的時間顯示。

在簡單情況下,您可以定期從代碼中的某些地方定期調用時間更新函數,您知道這些代碼將會定期執行。

在更復雜的情況下,您需要從單獨的執行線程更新時間。關於多線程有很多說法,包括on this site;不幸的是,我不能推薦任何具體的介紹材料,但有很多。

[編輯]如果你只是想在後臺運行另一個程序,像@ecatmur建議的那樣,你不需要線程;在Unix-ish系統上只使用system("program &")fork + exec,在Windows上使用_spawn

+0

我認爲OP只是想運行一個單獨的後臺程序,在這種情況下'bg'可以正常工作。 – ecatmur 2012-08-02 15:45:34

+0

@ecatmur - 你是對的,謝謝。我已將這種可能性添加到我的答案中。 – atzz 2012-08-03 12:02:27

0

問題這不是一個簡單的問題,因爲在Unix下,程序在運行時會完全控制終端,這意味着您在運行之後運行的任何程序都會假定它可以使用顯示時鐘的空間,並進一步假定將光標置於特定位置時它將保持在那裏。

有其他程序避免特定區域是不給他們訪問擺在首位的終端,而是交給他們,他們寫信給它一個僞終端和解釋一切(這是怎麼了兩個唯一的辦法xtermscreen工作);這是不平凡的,因爲還有許多控制序列用於設置前景和背景顏色,重新定位光標,改變自動滾動的區域等)。

1

這是一個顯示時間。

#include <windows.h> 
#include <conio.h> 
#include <stdio.h> 
#include<time.h> 



int ch=0; 
time_t now; 

void gotoxy(int x, int y) 
{ 
    COORD coord; 
    coord.X = x; coord.Y = y; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 
    return; 
} 

void setcolor(WORD color) 
{ 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color); 
    return; 
} 

void clrscr() 
{ 
    COORD coordScreen = { 0, 0 }; 
    DWORD cCharsWritten; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize; 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); 
    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); 
    SetConsoleCursorPosition(hConsole, coordScreen); 
    return; 
} 

void getkey(void) 
{ 
    if (kbhit()) 
    { 
    ch=getch(); 

    } 
} 



int main(void) 
{ 



    while (ch!=27) 
    { 
     getkey(); 
     time(&now); 

     gotoxy(50,1) ; 
     setcolor(31); 
     printf("%s", ctime(&now)); 
     setcolor(0); 
    } 

    setcolor(7); 
    clrscr(); 

    gotoxy(2,23) ; 
    return 0; 

}