5

Cでncursesを使用してゲームを実装しようとしています。現在の時刻を表示する必要があり(時刻は毎秒更新する必要があります)、whileループは次のようになります。

while(1)
{
    clk = time(NULL);
    cur_time = localtime(&clk);
    mvprintw(0,1,"%d %d %d",cur_time->tm_hour,cur_time->tm_min,cur_time->tm_sec);
    int key = getch()
    //other stuff
}

私の問題は、キーを押したときにのみ時刻が更新されることです。キーを押さなくても時間を更新できる(そして同じ時間にこれを実装する)方法ですか?

4

3 に答える 3

5

使用できる関数がいくつかあります。

  1. 遅延なし
  2. タイムアウト

int nodelay(WINDOW * win、bool bf);

getch()を非ブロッキングにするためにbfをtrueに設定します

void timeout(int delay);

遅延はミリ秒単位であるため、1000に設定すると、getchは1秒後にタイムアウトします。

どちらの場合も、入力がない場合、getchはERRを返します。

于 2013-01-02T22:01:14.370 に答える
1

ここでの解決策は、非ブロッキングIOを使用するか、スレッドを使用するかのいずれかです。ただし、スレッドを使用すると、常に1つのスレッドのみが呪いを使用できるという新しい問題が発生するため、他のスレッドがその時点で呪いを使用できないようにするには、ロックなどを使用する必要があります。時間。もちろん、そのための1つの解決策は、1つのスレッドが画面コンテンツの更新を担当し、他のスレッドが「X、Yで画面に表示したい」というメッセージをそのスレッドに送信することです。

于 2012-12-29T15:32:10.870 に答える
0

これは非常に醜いハックであり、単一のstdio関数fgetc()のみをサポートします。ところで、他のものを追加することができます。タイマーを設定することで機能します。1文字が読み取られる前にアラームが鳴ると、代わりに-2の値が返されます(覚えておいてください:-1はEOFを意味します)

fgetc()(etc)を直接呼び出す可能性のある他のcursesのwgetXXX()関数では機能しませんYMMV。

ただし、一般的なケースでは、wgetch_events()を調査する必要があると思います。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>

sigjmp_buf the_jump;

int my_fgetc(FILE *fp, unsigned timeout);
void sig_handler(int signr);

void sig_handler(int signr) {
        switch (signr) {
        case SIGALRM:
              siglongjmp(the_jump,1);
              break;
        default:
              break;
        }
}

int my_fgetc(FILE *fp, unsigned timeout)
{
alarm( timeout);

switch (sigsetjmp(the_jump, -1)) {
case 0:
        alarm(0);
        return fgetc (fp);
case 1:
        return -2;
default:
        return -3;
        }
}

int main()
{
int rc;
signal(SIGALRM, sig_handler);

rc = setvbuf(stdin, NULL, _IONBF, 0);
printf("setvbuf(_IONBF) = %d\n", rc);
while (1) {
        rc = my_fgetc(stdin, 1);
        printf("my_fgetc(NULL) = %d\n", rc);
        }

return 0;
}
于 2012-12-29T18:59:57.293 に答える