0

CI では単純にいくつかのパイプを作成し、dup2 を使用して std ファイル記述子を上書きしますが、反対側では、ブロック IO を利用して無限ループで各出力パイプ (sdtout、sdterr) のスレッドを作成します。コンソールの提案に合わせて textArea/canvas を更新するためのパイプ。stdin については、そのようなコンポーネントの主要なイベントをリッスンし、それらをパイプに書き込みます。

しかし、swing を使用して Java でそれを実行するにはどうすればよいでしょうか?

プロジェクト ディレクティブとしてネイティブ コードを混在させることはできません。これまでに多くのプロジェクト ディレクティブを破ったので、それを進めることはできません...

また、VT100 など、ある程度の端末エミュレーションを提供することもクールですが、そのような機能を Java アプリに通知する方法については、unix で TERM envvar を設定します。

CI では次のようになります。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

static pthread_t workers[2];

static void *_worker(void *file)
{
    int c;
    if(!file) pthread_exit(NULL);

    while((c=fgetc(file))!=EOF) {
        // Sync and put C on the screen
    }

    pthread_exit(NULL);
}

int initConsole()
{
    int stdin_pipe[2], stdout_pipe[2], stderr_pipe[2];

    if(!(pipe(stdin_pipe)||pipe(stdout_pipe)||pipe(stderr_pipe))) {
        if(dup2(stdin_pipe[0], STDIN_FILENO)<0) return -1;
        if(dup2(stdout_pipe[1], STDOUT_FILENO)<0) return -1;
        if(dup2(stderr_pipe[1], STDERR_FILENO)<0) return -1;

        pthread_create(&workers[0], NULL, _worker, fdopen(stdout_pipe[0], "r"));
        pthread_create(&workers[1], NULL, _worker, fdopen(stderr_pipe[0], "r"));

        // Register a handler within the toolkit to push chars into the stdin_pipe

        return 0;
    }

    return -1;
}
4

2 に答える 2

1

System.err/out および in は、Java で同じことを行う必要があります。また、チャンネルを継承しました [System.inheritedChannel()]

最初にあなたの質問を誤解したので、スレッドで System.in を読み取り、 EventQueue.invokeLater() を使用してテキスト領域に追加する必要がある場合。

于 2011-01-05T15:25:58.270 に答える
1

PrintStream をサブクラス化し、クラスを取得して JTextArea に書き込むだけで、System.out を JTextArea に送信できます。次に、クラスのインスタンスを簡単に作成して呼び出しSystem.setOut(yourInstance)ます。

read()InputStream をサブクラス化し、JTextArea からデータを返すことによってメソッドを実装することによって、System.in でかなり似たようなことを行うことができます。

于 2011-01-05T15:31:51.127 に答える