6

1980 年代の Apple II BASIC では、"HGR" を使用して画面に移動し、"HCOLOR" で色を設定し、"HPLOT" で点をプロットしていました。また、スクリーン バイト データを操作することもでき、プログラム制御をイベント ハンドラに渡す必要はありません。この途方もなく初歩的な機能は、今日、すべての言語とすべてのライブラリに欠けているようです。

そこで、 X Window APIを使用して C でこれを行うための小さなライブラリを作成しました。ウィンドウのビットマップを変更し、変更したものを表示できます。これは簡単なことではありませんでした。二度とやりたくありません。

私は現在いくつかの目的で Perl を使用していますが、Perl 用のツールが必要です。新しいスレッドを生成せずに戻るサブルーチンを呼び出すことができ、ウィンドウを出力し、ウィンドウにグラフィカルなものを追加できます。プログラムが気に入ったときにイベントをクエリします。これは 1980 年代の BASIC の機能なので、難しくはないはずです。しかし、私が見たツールではそれができませんでした:

  • GD: 私が見る限り、これはグラフィック ウィンドウではなく、グラフィック ファイルを作成します。別のプログラムにパイプする必要があるようです。
  • Gtk2: イベントをキャッチするために別のスレッドを分岐する必要があります。そうしないと、ウィンドウが表示されません。私は何もフォークしたくありません。後でキューに積み上げられたものを見るように特に頼まない限り、ほとんどのイベントは気にしません。
  • Qt : ここでは、制御をイベント ハンドラーに渡すことも期待されます。受け渡しなし、表示なし。C++ バージョンでは、ハンドオフなしで Qt を表示および描画することができました。
  • PerlTk: 再び愚かなハンドオフで。
  • OpenGL: ここでは、キープレスなどの X ウィンドウ イベントをキャッチする方法がわかりません。

実行中のアプリケーションから XWindow を起動する方法を知っている人はいますか? GUI アプリケーション プロセスをフォークせずに、点や線などの基本的なものをウィンドウに描画でき、自分のスケジュールでウィンドウのイベントを照会できる場所を知っていますか? Perl 用の X Window API を簡単に調べてみましたが、これは C と同じくらい恐ろしいものであり、C コードと Perl とのインターフェースも恐ろしいものです。必要なら、やります。しかし、そうではないかもしれません。Perl 用の HGR は既にありますか?

私が何を意味するのか疑問に思っている場合は、イベント ループ グラフィカル ライブラリがありません。このリンクされた論文を参照してください。これは残念ながら C 用です。このようなことは、プログラミングの入門クラス以外の科学的なものに非常に役立ちます。

4

4 に答える 4

4

ほぼすべての GUI ツールキットが、イベント ループに入ることなくウィンドウを作成することをサポートしています。ここにtkの例があります

#!/usr/bin/perl --
use strict;
use warnings;
use Tk;
my $mw = tkinit();
my $ca = $mw->Canvas(
    background => 'white'
)->pack(qw/-expand 1 -fill both /);
$mw->geometry( '500x600+10+10' );
for my $cc (
    { red   => \&red, green => \&der, blue => \&erd },
    { green => \&red, red   => \&der, blue => \&erd },
    { green => \&red, blue  => \&der, red  => \&erd },
  )
{
    $ca->delete('all');
    my %color = %$cc;

    for my $fill ( keys %color ) {
        my $red = $color{$fill};
        for my $t ( 10 .. 220 ) {
            my $d = 0.1;
            my ( $x, $y ) = $red->( $t, 0.1 );
            $_ += 250 for $x, $y;
            $ca->createOval(
                $x, $y,
                ( $t * 2 * $d ) + $x,
                ( $t * 2 * $d ) + $y,
                -fill => $fill,
            );
            $mw->update;
            select undef, undef, undef, 0.001;
        }
        $mw->update;
    }
}

Tk::DoOneEvent(0) while Tk::MainWindow->Count; ## MainLoop;
exit 0;

sub red {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * $d );
    my $y = $t * cos( $t * $d );
    $x, $y;
}

sub der {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * $d );
    my $y = $t * cos( $t * 2 * $d );
    $x, $y;
}

sub erd {
    my ( $t, $d ) = @_;
    my $x = $t * sin( $t * 2 * $d );
    my $y = $t * cos( $t * $d );
    $x, $y;
}

__END__

Gtk2 と Wx はどちらも更新/表示/表示のいずれかで同じことをサポートし、ウィンドウが描画されます。ユーザーの操作が必要な場合は、MainLoop を呼び出すか、アプリを実行するか、自分で処理します。while ループのディスパッチだけです。保留中のイベント

wxTheApp->Dispatch       while wxTheApp->Pending;
Gtk2->main_iteration     while Gtk2->events_pending;
于 2012-10-01T02:29:11.340 に答える
1

Perl モジュールInline::Cの使用をお勧めします。このモジュールを使用すると、C ライブラリを Perl アプリケーションに簡単に公開できます。一部の C ライブラリでは、'AUTOWRAP' オプションを使用すると、完全に簡単になります。しかし、いくつかのラッパーを自分で書かなければならない場合でも、Inline::C は XS の負担を本当に軽減します。

于 2012-10-01T05:00:09.100 に答える
0

GLibその場合、 /のようなものの筋書きを少し見逃したと思いますGTKGTK分岐せずに処理することは非常に可能です。実際、フォークのようなことをすると、そこで間違っている可能性があります。あなたが説明することは、を使用して簡単に可能になるはずですGTK

于 2012-09-30T17:03:43.727 に答える
0

あなたの最終目標が何であるかは正確にはわかりません。これは役に立たないかもしれませんが、おそらく David Merten のApp::Prima::REPL. David は、グラフィカル ツールキット上に構築された Perl/PDL 用のプロット ライブラリを構築しています。Primaそれを論理的に極端にするために、彼はそれを中心に REPL を構築し、組み込みのプロットを備えた GUI REPL を作成しました。あなたが言うように、Prima は機能するためにイベント ループに依存していますが、REPL 内にいるため、REPL に新しいデータをプロットするように指示することができます。彼の目標は科学的な使用でもあります。

于 2012-09-30T13:11:09.267 に答える