1: 2003-10-24 (金) 07:33:00 |
現: 2024-01-08 (月) 12:58:55 ゲスト |
| * シグナル関係 [[GUIGUI00_man]] | | * シグナル関係 [[GUIGUI00_man]] |
| #contents | | #contents |
| + | |
| + | ***lib_initsignalbox0_256 |
| + | -lib_init + lib_opensignalbox |
| + | -準備中 |
| + | -参考:[[gg00man/lib_getsig]] |
| + | |
| + | ***lib_getsig0w |
| + | -準備中 |
| + | -参考:[[gg00man/lib_getsig]] |
| | | |
| ***lib_opensignalbox | | ***lib_opensignalbox |
| int *lib_opensignalbox(int bytes, int *signalbox, int eos, int rewind) : | | int *lib_opensignalbox(int bytes, int *signalbox, int eos, int rewind) : |
| + | |
| シグナルを扱うアプリでは、ライブラリを初期化したらできるだけ速やかにこの | | シグナルを扱うアプリでは、ライブラリを初期化したらできるだけ速やかにこの |
| コマンドを実行すること。 | | コマンドを実行すること。 |
| + | |
| シグナルボックスをオープンする。bytesはシグナルボックスの大きさを、 | | シグナルボックスをオープンする。bytesはシグナルボックスの大きさを、 |
- | バイト単位で指定します(必ず4の倍数にすること)。あまり小さいのは頻繁にrewin(後述) | + | バイト単位で指定します(必ず4の倍数にすること)。あまり小さいのは頻繁にrewind(後述) |
| しなければいけなくなるが、かといって大きすぎるのはメモリの無駄になる。 | | しなければいけなくなるが、かといって大きすぎるのはメモリの無駄になる。 |
| 256~4096くらいの範囲で使うべきだろう。signalboxはとりあえず0にする。 | | 256~4096くらいの範囲で使うべきだろう。signalboxはとりあえず0にする。 |
| 場合はポインタをインクリメントせずにスリープする。シグナルがくれば目覚めるので、 | | 場合はポインタをインクリメントせずにスリープする。シグナルがくれば目覚めるので、 |
| 再度そこを読めばよい。 | | 再度そこを読めばよい。 |
| + | |
| この調子でシグナルを処理していくと、そのうちポインタがシグナルボックスの | | この調子でシグナルを処理していくと、そのうちポインタがシグナルボックスの |
| 末尾に到達する。その場合は次のシグナルは先頭に書かれている。この判定は | | 末尾に到達する。その場合は次のシグナルは先頭に書かれている。この判定は |
| システム側で必要に応じてやっているため、アプリはポインタをインクリメント | | システム側で必要に応じてやっているため、アプリはポインタをインクリメント |
| するごとにチェックする必要はない。システムがポインタの先頭へのまき戻しが | | するごとにチェックする必要はない。システムがポインタの先頭へのまき戻しが |
- | 必要だと判断するとrewindシグナルが書き込まれます。アプリ側では、これを | + | 必要だと判断するとrewindシグナルが書き込まれる。アプリ側では、これを |
| 受け取ったらポインタを先頭に戻す。 | | 受け取ったらポインタを先頭に戻す。 |
| + | |
| 参考になるサンプル:movec2(introa) | | 参考になるサンプル:movec2(introa) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0060 |
| | | |
| ***lib_waitsignal | | ***lib_waitsignal |
| void lib_waitsignal(int opt, int signaldw, int nest) : | | void lib_waitsignal(int opt, int signaldw, int nest) : |
| + | |
| optを1にすれば、タスクはスリープし、事実上終了する。残り2つの引数は0にする。 | | optを1にすれば、タスクはスリープし、事実上終了する。残り2つの引数は0にする。 |
| signaldwは、アプリがシグナルを処理したことをライブラリに知らせるためのもので、 | | signaldwは、アプリがシグナルを処理したことをライブラリに知らせるためのもので、 |
| 通知してもよい。単にsignaldwを通知するためだけにlib_waitsignal()を使う時は、 | | 通知してもよい。単にsignaldwを通知するためだけにlib_waitsignal()を使う時は、 |
| optを0する。 | | optを0する。 |
| + | |
| スリープのためにlib_waitsignal()を使うときは、この場合シグナルボックスが | | スリープのためにlib_waitsignal()を使うときは、この場合シグナルボックスが |
| 空になっていなければならない。もし1つでもシグナルが残っていれば、 | | 空になっていなければならない。もし1つでもシグナルが残っていれば、 |
| 空にする。読み終えたと報告したシグナルを後から読むことは許されないので、 | | 空にする。読み終えたと報告したシグナルを後から読むことは許されないので、 |
| あとで処理したければ、読み進めるシグナルを別のバッファに転送しておく。 | | あとで処理したければ、読み進めるシグナルを別のバッファに転送しておく。 |
| + | |
| 参考になるサンプル:movec2(introa) | | 参考になるサンプル:movec2(introa) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f |
| | | |
| **シグナル定義 | | **シグナル定義 |
| void lib_definesignal1p0(int opt, int default_assign0, int default_assign1, | | void lib_definesignal1p0(int opt, int default_assign0, int default_assign1, |
| struct LIB_WINDOW *default_assign2, int signal) : | | struct LIB_WINDOW *default_assign2, int signal) : |
| + | |
| キー入力とシグナル番号の対応づけを行う。まず、基本的にoptは0、default_assign0 | | キー入力とシグナル番号の対応づけを行う。まず、基本的にoptは0、default_assign0 |
| には0x100を指定する。default_assign1はキーコード、default_assign2はウィンドウを | | には0x100を指定する。default_assign1はキーコード、default_assign2はウィンドウを |
| 指定したキーが押されると、signalで指定されたシグナルがシグナルボックスに | | 指定したキーが押されると、signalで指定されたシグナルがシグナルボックスに |
| 送られる。 | | 送られる。 |
| + | |
| default_assign1は、基本的にアスキーコードで指定する。' 'や'A'や'('など、これで | | default_assign1は、基本的にアスキーコードで指定する。' 'や'A'や'('など、これで |
| たいていのキーが指定できる。しかし、カーソルキーやEnterなど、アスキーコードでは | | たいていのキーが指定できる。しかし、カーソルキーやEnterなど、アスキーコードでは |
| 0xa8 PageUp 0xa9 PageDown | | 0xa8 PageUp 0xa9 PageDown |
| 0xac Left 0xad Right 0xae Up 0xaf Down | | 0xac Left 0xad Right 0xae Up 0xaf Down |
| + | |
| また、 | | また、 |
| for (i = 0; i < 10; i++) | | for (i = 0; i < 10; i++) |
| 現在のバージョンのOSASKではlib_definesignal1p0()を呼び出せる回数に制限があり、 | | 現在のバージョンのOSASKではlib_definesignal1p0()を呼び出せる回数に制限があり、 |
| この機能を利用してlib_definesignal1p0()の呼び出し回数を減らすのがよい。 | | この機能を利用してlib_definesignal1p0()の呼び出し回数を減らすのがよい。 |
| + | |
| optに0、default_assign0に0x10、default_assign2に0を指定すると、 | | optに0、default_assign0に0x10、default_assign2に0を指定すると、 |
| タイマーシグナル設定になる。default_assign1には対応するタイマーのslot番号 | | タイマーシグナル設定になる。default_assign1には対応するタイマーのslot番号 |
| (オープン済みであること)を指定する。 | | (オープン済みであること)を指定する。 |
- | | + | |
- | 参考になるサンプル:movec2(introa),dblcntc0(introb) | + | 参考になるサンプル: |
| + | キーシグナル:movec2(introa), keytstc0(introc)[拡張キーシグナル] |
| + | タイマーシグナル:dblcntc0(introb) |
| + | -p0crefリンク: |
| + | --キーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370/osask/p0cref.html#0068_100 |
| + | --タイマーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370/osask/p0cref.html#0068_10 |
| + | --低レベルマウスシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370/osask/p0cref.html#0068_200 |
| | | |
| ***void lib_definesignal0p0 | | ***void lib_definesignal0p0 |
| void lib_definesignal0p0(int opt, int default_assign0, int default_assign1, | | void lib_definesignal0p0(int opt, int default_assign0, int default_assign1, |
| int default_assign2); | | int default_assign2); |
| + | |
| シグナルの割り当て宣言が一通り終わったことをライブラリに通知する。 | | シグナルの割り当て宣言が一通り終わったことをライブラリに通知する。 |
| 4つ全ての引数は必ず0にする。 | | 4つ全ての引数は必ず0にする。 |
| + | |
| 参考になるサンプル:movec2(introa) | | 参考になるサンプル:movec2(introa) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0068_0 |
| | | |
| **タイマー制御 | | **タイマー制御 |
| void lib_waitsignaltime(int opt, int signaldw, int nest, | | void lib_waitsignaltime(int opt, int signaldw, int nest, |
| unsigned int time0, unsigned int time1, unsigned int time2) : | | unsigned int time0, unsigned int time1, unsigned int time2) : |
| + | |
| タスクを一定時間スリープさせる。optには、0x7か0xfを指定できる。 | | タスクを一定時間スリープさせる。optには、0x7か0xfを指定できる。 |
| signaldwとnestは0にする。time0~time2の設定方法は、以下。 | | signaldwとnestは0にする。time0~time2の設定方法は、以下。 |
| 実際はハードウェアの都合によりこの96bitの精度が完全に生かされるとは | | 実際はハードウェアの都合によりこの96bitの精度が完全に生かされるとは |
| 限らない(限界まで生かす努力はする)。 | | 限らない(限界まで生かす努力はする)。 |
| + | |
| optに0xfを指定した場合、 | | optに0xfを指定した場合、 |
| この関数をコールした時刻から指定された時間だけ待った後にタスクは目覚める。 | | この関数をコールした時刻から指定された時間だけ待った後にタスクは目覚める。 |
| 他の処理をする時間もあるからである。0xfを指定すると徐々に誤差が累積されるが、 | | 他の処理をする時間もあるからである。0xfを指定すると徐々に誤差が累積されるが、 |
| 0x7ならそういうことはない。誤差が出る場合は、アプリケーションの問題ではない。 | | 0x7ならそういうことはない。誤差が出る場合は、アプリケーションの問題ではない。 |
| + | |
| 本来はこの関数は一定時間待つためのものではなく、時限付きシグナル待ち | | 本来はこの関数は一定時間待つためのものではなく、時限付きシグナル待ち |
| というもので、シグナルがくれば時刻に達していなくてもタスクはスリープから回復する。 | | というもので、シグナルがくれば時刻に達していなくてもタスクはスリープから回復する。 |
| シグナル処理をしながら時間を待つもっとも単純な方法はタイマーシグナルを | | シグナル処理をしながら時間を待つもっとも単純な方法はタイマーシグナルを |
| 使うことである。 | | 使うことである。 |
| + | |
| この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい。これは何も | | この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい。これは何も |
| 10ミリ秒単位であることを要請しているわけではない。11.52ミリ秒などでも | | 10ミリ秒単位であることを要請しているわけではない。11.52ミリ秒などでも |
| 10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは、OSの動作が不安定に | | 10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは、OSの動作が不安定に |
| なるからやってはいけない。 | | なるからやってはいけない。 |
| + | |
| 参考になるサンプル:cntdwnc1(introa) | | 参考になるサンプル:cntdwnc1(introa) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f |
| | | |
| ***lib_opentimer | | ***lib_opentimer |
| void lib_opentimer(int slot) : | | void lib_opentimer(int slot) : |
| + | |
| タイマーシグナルのために、タイマーをオープンする。slotには0x1c0を指定する。 | | タイマーシグナルのために、タイマーをオープンする。slotには0x1c0を指定する。 |
| これはシステムタイマーslot番号で、これをオープンするとlib_waitsignaltime()が | | これはシステムタイマーslot番号で、これをオープンするとlib_waitsignaltime()が |
| タイマーは指定されたslotだけではなく、続く2つを合わせて計3つのslot使用する。 | | タイマーは指定されたslotだけではなく、続く2つを合わせて計3つのslot使用する。 |
| なお、オープン直後のタイマーは休止状態にある。 | | なお、オープン直後のタイマーは休止状態にある。 |
| + | |
| 参考になるサンプル:dblcntc0(introb) | | 参考になるサンプル:dblcntc0(introb) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0070 |
| | | |
| ***lib_closetimer | | ***lib_closetimer |
| void lib_closetimer(int slot) : | | void lib_closetimer(int slot) : |
| + | |
| オープンしていたタイマーをシステムに返しスロットを開放します。 | | オープンしていたタイマーをシステムに返しスロットを開放します。 |
| クローズ後は、そのタイマーに対する設定はできない。再度オープンしても、 | | クローズ後は、そのタイマーに対する設定はできない。再度オープンしても、 |
| slotはタイマーとして使っていたスロット番号を指定する。使用している3つのうち、 | | slotはタイマーとして使っていたスロット番号を指定する。使用している3つのうち、 |
| 最初の1つを指定する。 | | 最初の1つを指定する。 |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0074 |
| | | |
| ***lib_settimertime | | ***lib_settimertime |
| void lib_settimertime(int opt, int slot, | | void lib_settimertime(int opt, int slot, |
| unsigned int time0, unsigned int time1, unsigned int time2) : | | unsigned int time0, unsigned int time1, unsigned int time2) : |
| + | |
| タイマーの時間設定をする。slotはタイマーのslot番号を指定する。 | | タイマーの時間設定をする。slotはタイマーのslot番号を指定する。 |
| time0~time2は、lib_waitsignaltime()のものと同じ表しかたで時間を表す。 | | time0~time2は、lib_waitsignaltime()のものと同じ表しかたで時間を表す。 |
| optは0x32と0x12が使える。 | | optは0x32と0x12が使える。 |
| + | |
| (註)古いguide(たとえばguide5cやguide05など)には、optのbit2, bit3を1に | | (註)古いguide(たとえばguide5cやguide05など)には、optのbit2, bit3を1に |
| できるような記述があるが、これは廃止された機能なので利用してはならない。 | | できるような記述があるが、これは廃止された機能なので利用してはならない。 |
| これらのbitは必ず0です。新しい版のOSASKではこれらの廃止された機能を利用できない。 | | これらのbitは必ず0です。新しい版のOSASKではこれらの廃止された機能を利用できない。 |
| + | |
| optの0x32と0x12の違いは、lib_waitsignaltime()のoptでの0xfと0x7の違いに相当。 | | optの0x32と0x12の違いは、lib_waitsignaltime()のoptでの0xfと0x7の違いに相当。 |
| つまり、0x32ではtime0~time2は「現在時刻に対する」値と解釈される。 | | つまり、0x32ではtime0~time2は「現在時刻に対する」値と解釈される。 |
| シグナルを発するか、もしくはキャンセルすることによって休止状態に戻るまで | | シグナルを発するか、もしくはキャンセルすることによって休止状態に戻るまで |
| 次の設定はできない。 | | 次の設定はできない。 |
| + | |
| + | タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様に、間隔が少なくとも |
| + | 10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位であることを要請している |
| + | わけではない。また頻繁に繰り替えすことがないのなら、10ミリ秒を |
| + | 下回ることがあってもかまわない。将来のOSASKでは、連続して何度も10ミリ秒以下の |
| + | 指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性がある。 |
| + | 現在のOSASKでは、OSの動作が不安定になるので、やってはいけない。 |
| + | |
| 参考になるサンプル:dblcntc0(introb) | | 参考になるサンプル:dblcntc0(introb) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_32 |
| | | |
| ***lib_settimer | | ***lib_settimer |
| void lib_settimer(int opt, int slot) : | | void lib_settimer(int opt, int slot) : |
| + | |
| 設定したタイマーをキャンセルする(これはキャンセルであって、クローズではない)。 | | 設定したタイマーをキャンセルする(これはキャンセルであって、クローズではない)。 |
| optには0x01を指定する。slotはタイマーのslot番号を指定する。 | | optには0x01を指定する。slotはタイマーのslot番号を指定する。 |
| かならずこの関数でキャンセルしてからにすること。 | | かならずこの関数でキャンセルしてからにすること。 |
| もともと休止状態にあるタイマーに対し、キャンセルしてもよいが、何も起きない。 | | もともと休止状態にあるタイマーに対し、キャンセルしてもよいが、何も起きない。 |
| + | |
| + | 参考になるサンプル:dblcntc0(introb) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_1 |
| | | |
- | タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様に、間隔が少なくとも | + | ***lib_settimertime2 |
- | 10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位であることを要請している | + | void lib_settimertime2(int opt, int slot0, int slot1, unsigned int *time) : |
- | わけではない。また頻繁に繰り替えすことがないのなら、10ミリ秒を | + | |
- | 下回ることがあってもかまわない。将来のOSASKでは、連続して何度も10ミリ秒以下の | + | 2つのタイマーの間の時間差を算出します。timeはunsigned intの配列(もしくはポイ |
- | 指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性がある。 | + | ンタ)で、最低でも3つの要素が必要です。計算された値が、timeに格納されます。 |
- | 現在のOSASKでは、OSの動作が不安定になるので、やってはいけない。 | + | |
| + | time = slot1 - slot0 |
| + | |
| + | time[0]が下位で、time[2]が上位です。time[1]がちょうど秒の位になります。つまり、 |
| + | タイマー設定の際のいつもの単位です。なおこの時に返される値の精度については保証 |
| + | しません。おそらくOSASKのバージョンによってまちまちでしょう。 |
| + | |
| + | 参考になるサンプル:starsc0(introd) |
| + | -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_82 |
| | | |
| **タイマーの3つの状態 | | **タイマーの3つの状態 |
| B.休止状態(オープンされているが、時刻がきてもシグナルを発しない) | | B.休止状態(オープンされているが、時刻がきてもシグナルを発しない) |
| C.待機状態(時刻がくればシグナルを発する) | | C.待機状態(時刻がくればシグナルを発する) |
| + | |
| A状態のタイマーに対してはオープンしかできない。オープンするとB状態になる。 | | A状態のタイマーに対してはオープンしかできない。オープンするとB状態になる。 |
| A状態のまま設定を行ってはいけない。 | | A状態のまま設定を行ってはいけない。 |
| + | |
| B状態のタイマーに対しては各種の設定とクローズができる。設定などによって、 | | B状態のタイマーに対しては各種の設定とクローズができる。設定などによって、 |
| B状態のままだったり、A状態になったり、C状態になったりする。 | | B状態のままだったり、A状態になったり、C状態になったりする。 |
| + | |
| C状態のタイマーに対しては時刻になってシグナルが発生するのを待つか、 | | C状態のタイマーに対しては時刻になってシグナルが発生するのを待つか、 |
| キャンセルしかできない。キャンセルするとB状態になる。なお、設定時刻がきて | | キャンセルしかできない。キャンセルするとB状態になる。なお、設定時刻がきて |