2

Linux gcc で C++ プログラムを書きたいと思います。時間が右上に表示され (変化し続けます)、他のプロセスも進行するようにします。

例えば:

右上に時刻を表示させたいのですが、同じ画面で基本的な計算などの操作も行いたい...

. このスニペットを使用して継続的に時間を表示することを知っていました

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

しかし、毎回、1)画面がクリアされるため、画面上の他の指示もクリアされます2)両方のプロセスを同時に実行する方法も知りたいですか??

bg などを使用すると役立ちますか?

4

4 に答える 4

2

あなたの質問には2つの部分があります。

最初の部分: 画面上の他の出力を中断することなく、固定された場所に時間を出力する方法。

低レベルのアプローチ:

  • Windows では、Win32 WriteConsoleOutputなど。
  • Unix 系のシステムでは、端末のエスケープ シーケンスを使用してカーソルを移動します (ただし、端末によってエスケープ シーケンスのサポートが異なることに注意してください)。

高レベルのアプローチ: curses/ncursesなどのテキストベースの UI ライブラリを使用します。


第 2 部: 他のアクティビティと並行して時間表示を更新する方法。

単純なケースでは、十分に定期的に実行されることがわかっているコード内のいくつかの場所から定期的に時間更新関数を呼び出すことができます。

より複雑なケースでは、別の実行スレッドから時間を更新する必要があります。このサイトを含め、マルチスレッドについては多くのことが言われています。残念ながら、特定の入門資料を直接お勧めすることはできませんが、たくさんあります。

[編集] @ecatmur が示唆するように、バックグラウンドで別のプログラムを実行したいだけの場合は、スレッドは必要ありません。system("program &")、またはUnix っぽいシステムではfork + execを、Windows では_spawnを使用するだけです。

于 2012-08-02T15:21:15.893 に答える
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;

}
于 2012-08-05T14:01:10.700 に答える
0

これは些細な問題ではありません。Unix では、プログラムは実行中に端末を完全に制御します。つまり、自分のプログラムの後に実行するプログラムは、時計を表示しているスペースを使用できると想定し、さらにカーソルを特定の場所に置くと、そこにとどまると仮定します。

他のプログラムに特定の領域を回避させる唯一の方法は、最初に端末へのアクセスを許可するのではなく、疑似端末を渡して、それらが書き込むすべてを解釈することです (これが両方xtermscreen機能する方法です)。前景色と背景色の設定、カーソルの再配置、自動的にスクロールされる領域の変更などの多くの制御シーケンスがあるため、これは重要です)。

于 2012-08-03T12:31:39.780 に答える
0

Windowsハンドルを使用せずにカーソル位置を変更して、C ++で画面のある場所に何かを書くための私の質問と回答 です。Qbasic の模倣は遅い

これはスレッドに関する @pumpkins の質問です。

于 2012-08-03T12:13:22.807 に答える