我想在linux gcc上编写一个C ++程序,这样一来,时间应显示在右上方(不断变化),并使其他进程继续进行。
例如:
我希望时间显示在右上方,并希望在同一屏幕上执行基本计算等操作...
。我知道使用这个片段连续显示时间
#include<iostream.h>
int main()
{
while(1)
{
system("clear");
system("date +%r&");
sleep(1);
}
return 0;
}
但每一次, 1)它清除屏幕,因此屏幕上的其他指令也会被清除 2)我也想知道如何使两个进程同时运行?
使用bg等会有帮助吗?
答案 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下,程序在运行时完全控制终端,这意味着你运行的任何程序都会认为它可以使用显示时钟的空间,并且还会假设当它将光标定位在特定位置时,它将保持在那里。
让其他程序避开特定区域的唯一方法是首先不让它们访问终端,而是将它们交给伪终端并解释它们写入的所有内容(这就是xterm
和screen
的工作方式;这是非常重要的,因为还有很多控制序列用于设置前景色和背景色,重新定位光标,更改自动滚动的区域等。)。