Smart CODE
生成済みコードに関するオンラインガイド

サーバーにプッシュ。自動更新。既製の例題を使った学習


概要

この例題で使用するアプリケーションは、前に使用したものとほとんど同じです。すなわち、インタフェースは thin クライアントで、動作は対話を行うサーバーによって制御されます。 

これから、データ表示をリアルタイムで、または少なくとも定期的に更新するアプリケーションを記述します。今日、これはインターネットで一般的な機能であり、Web ページは、変更が必要になった時点でその内容を更新しています。 

この例題は、特別な知識が必要ないことを実証する一般的なものです。サーバーは、クライアント内の時計を一定の間隔で更新します。 

例題を実行する前に必要な作業と知識

環境変数、ほか

通常どおり、パスには必ず $XDROOT/bin を指定します。

例題を使用した作業を始める前に設定が必要な変数は、以下のものです。

XDROOT
LM_LICENSE_FILE

例題を準備する

手順 1 新しいディレクトリを作成し、ここでは仮に timex という名前を付けます。
手順 2 timex ディレクトリに移動します。
手順 3 xdreplay スクリプトの $XDROOT/src/examples/sc/timex.vcr を使用して、xdesigner を実行します。次のように指定します。
$ xdreplay -f $XDROOT/src/examples/sc/timex.vcr xdesigner

これを実行すると、アプリケーション例題が作成され、コードが生成され、ユーザーが記述しておいたコールバックの標準バージョンが適切な箇所にコピーされて、プログラムを構築するための呼び出しが行われます。 

例題を実行する

まず、環境変数が設定されていることを確認します。問題がある場合は、正しく設定されているかチェックします。
$ ls $XDROOT

次のように入力してアプリケーション例を実行します。
$ ./untitled

このプログラムはボタンを押すだけで実行できます。これによってコールバックがトリガーされ、サーバーに接続されます。現在時刻 (とりあえずはプログラムが実行されているサーバー上のローカルタイムゾーン) がテキストフィールドに表示されます。プログラムは、必要な回数だけサーバーをポーリングし、テキストフィールドの時刻を更新します。

例題の説明

前の例題との唯一の相違点は、thin クライアントの「カスタマイズ」ダイアログで「サーバーにプッシュ」トグルを押すことです。 

構築済みのバージョンを使用する場合は、次の URL を使用する必要があります。

http://www.ist.co.uk/cgi-bin/xd5_timex

「プロキシ・ホスト」および「プロキシ・ポート」フィールドを設定する代わりに、HTTP_PROXY 環境変数を次のように設定することができます。
        % setenv HTTP_PROXY     meinhost:80

従来の Web ページはリフレッシュメカニズムによって更新されます。言い換えれば、データがサーバーからプッシュされることは一切ありませんが、クライアントは更新のために定期的にサーバーをポーリングしています。これは、元の実装状態ではサーバーとクライアントの接続を持続することができなかったためです。接続が保持されるのは、データ転送の間だけでした。最近の開発により、永続的な接続が可能になりましたが、これはまだ主要なパラダイムにはなっていないので、クライアントがサーバーをポーリングする従来の方法に、当社独自の非同期更新を実装しました。 

HTML では、サーバーがリフレッシュレートを制御しますが、この例でも同様です。サーバーは、データがどの程度の頻度で更新されるか、またいつ更新をポーリングするのが有効かを認識しています。 

次のコールバック例はサーバーで実行されるものですが、ポーリング間隔は、次の行で設定されます。

data->poll = 10; /* 10 秒ごとに試行する */

ポーリング値がゼロ以外の正数であれば、クライアントはサーバーのポーリングとインタフェースの更新を継続して行います。 

この例題では、非常に単純な 2 つのシステムコールを使用して現在時刻をインタフェースのテキストフィールドに書き込みます。これは単なる実例ですが、これを使用して、最初の自己更新アプリケーションを簡単に組み立てることができます。 

time() では現在時刻は数値 (1970 年 1 月 1 日からの秒数) として取得され、ctime() ではこの数値が文字列に変換されます。 

この 2 つの関数が正常に機能するために、time (&t) のアドレスを両方に渡す必要があります。 

#include <time.h>

int
doit_callback  ( sc_data_t * data)
{
        group0_t * g = (group0_t*)data->group;

        time_t t;

        data->poll = 10; /* 10 秒ごとに試行する */

        time( &t);

        SC_SET(g->text1,ctime(&t));

        return 1;
}

注意