C++;使时间显示在后台连续显示的程序 我想在Linux GCC上编写一个C++程序,这样的时候应该显示在右上角(不断变化),也可以让其他进程继续下去。

C++;使时间显示在后台连续显示的程序 我想在Linux GCC上编写一个C++程序,这样的时候应该显示在右上角(不断变化),也可以让其他进程继续下去。,c++,C++,例如: 我希望时间显示在右上角,也希望在同一屏幕上执行一些操作,如基本计算 。我知道使用这个片段可以连续显示时间 #include<iostream.h> int main() { while(1) { system("clear"); system("date +%r&"); sleep(1); } return 0; } #包括 int main() { 而(1) { 系统(“清除”); 系统(“日期+%r&”); 睡眠(1); } 返回0; } 但是每一次,, 1

例如:

我希望时间显示在右上角,也希望在同一屏幕上执行一些操作,如基本计算

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

#include<iostream.h>
int main()
{
while(1)
{
system("clear");
system("date +%r&");
sleep(1); 
}
return 0;
}
#包括
int main()
{
而(1)
{
系统(“清除”);
系统(“日期+%r&”);
睡眠(1);
}
返回0;
}
但是每一次,, 1) 它会清除屏幕,因此屏幕上的其他指令也会被清除 2) 我还想知道如何使两个进程同时运行


使用bg etc会有所帮助?

您的问题有两个部分

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

低级别方法:

  • 在Windows、Win32和friends上
  • 在Unix ish系统上,用于四处移动光标(但请记住,终端对转义序列的支持不同)
高级方法:使用基于文本的UI库,例如


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

在简单的情况下,您可以从代码中的某些地方周期性地调用time update函数,您知道这些函数将定期执行

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


[编辑]如果您只想在后台运行另一个程序,正如@ecatmur所建议的,您不需要线程;只需在Unix ish系统和Windows上使用
system(“program&”)或+即可。

以下是我的问题和答案,可以在屏幕的某个位置写东西

这里是关于线程的@pumpkins问题

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


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

这里是一个显示时间的控制序列

#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;

}
#包括
#包括
#包括
#包括
int ch=0;
现在是时候了;
void gotoxy(整数x,整数y)
{
合作社;
坐标X=X;坐标Y=Y;
设置控制台或位置(GetStdHandle(标准输出句柄),坐标);
返回;
}
void setcolor(单词颜色)
{
SetConsoleTextAttribute(GetStdHandle(标准输出句柄),颜色);
返回;
}
void clrsc()
{
COORD coordScreen={0,0};
德沃德;
控制台屏幕缓冲区信息csbi;
德沃德·德康塞兹;
HANDLE hConsole=GetStdHandle(标准输出句柄);
GetConsoleScreenBufferInfo(hConsole和csbi);
dwConSize=csbi.dwSize.X*csbi.dwSize.Y;
FillConsoleOutputCharacter(hConsole、文本(“”)、dwConSize、coordScreen和CCharsWrite);
GetConsoleScreenBufferInfo(hConsole和csbi);
填写控制台输出属性(hConsole、csbi.wAttributes、dwConSize、coordScreen和ccharsWrite);
设置控制台位置(hConsole、coordScreen);
返回;
}
void getkey(void)
{
if(kbhit())
{
ch=getch();
}
}
内部主(空)
{
while(ch!=27)
{
getkey();
时间(现在);
gotoxy(50,1);
setcolor(31);
printf(“%s”,ctime(&now));
setcolor(0);
}
setcolor(7);
clrsc();
gotoxy(2,23);
返回0;
}

要同时在程序中执行其他任务,请将这两个任务拆分为单独的线程。如果有最新的编译器,可以使用pthreads或C++11的内置线程功能。你应该能够在网上找到这两个方面的大量信息和指南。我认为OP只是想运行一个单独的后台程序,在这种情况下,
bg
就可以了。@ecatmur-你说得对,谢谢。我在回答中增加了这种可能性。