C ++程序使时间显示连续显示在背景上

时间:2012-08-02 15:06:21

标签: c++

我想在linux gcc上编写一个C ++程序,这样一来,时间应显示在右上方(不断变化),并使其他进程继续进行。

例如:

我希望时间显示在右上方,并希望在同一屏幕上执行基本计算等操作...

。我知道使用这个片段连续显示时间

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

但每一次, 1)它清除屏幕,因此屏幕上的其他指令也会被清除 2)我也想知道如何使两个进程同时运行?

使用bg等会有帮助吗?

4 个答案:

答案 0 :(得分:2)

您的问题分为两部分。

第一部分:如何在不中断屏幕上的其他输出的情况下在固定位置输出时间。

低级方法:

高级方法:使用基于文本的UI库,例如curses/ncurses


第二部分:如何与其他活动并行更新时间显示。

在简单的情况下,您可以定期从代码中的某些地方调用时间更新功能,您知道这些地方会定期执行。

在更复杂的情况下,您需要从单独的执行线程更新时间。关于多线程有很多说法,包括on this site;不幸的是,我不能随便推荐任何具体的介绍材料,但有很多。

[编辑] 如果你只是想在后台运行另一个程序,正如@ecatmur建议的那样,你不需要线程;只需在Unix-ish系统上使用system("program &")fork + exec,在Windows上使用_spawn

答案 1 :(得分: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;

}

答案 2 :(得分:0)

这是我在屏幕的某个位置写东西的问题和答案 in c++, changing cursor location without using the windows handle. Qbasic imitation is slow

这里是@pumpkins的线程问题 Running a function in a thread

答案 3 :(得分:0)

这不是一个小问题,因为在Unix下,程序在运行时完全控制终端,这意味着你运行的任何程序都会认为它可以使用显示时钟的空间,并且还会假设当它将光标定位在特定位置时,它将保持在那里。

让其他程序避开特定区域的唯一方法是首先不让它们访问终端,而是将它们交给伪终端并解释它们写入的所有内容(这就是xtermscreen的工作方式;这是非常重要的,因为还有很多控制序列用于设置前景色和背景色,重新定位光标,更改自动滚动的区域等。)。