サイトトップへ
OSASK.NET
  サイトトップへ       新掲示板(閉鎖済)   Wiki(凍結済)   旧掲示板(廃止済)   ニュース(廃止済)  
4: 2004-06-12 (土) 15:26:34 ソース 現: 2024-01-08 (月) 12:58:55 ゲスト ソース
Line 13: Line 13:
***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にする。
Line 28: Line 28:
 場合はポインタをインクリメントせずにスリープする。シグナルがくれば目覚めるので、  場合はポインタをインクリメントせずにスリープする。シグナルがくれば目覚めるので、
 再度そこを読めばよい。  再度そこを読めばよい。
 + 
 この調子でシグナルを処理していくと、そのうちポインタがシグナルボックスの  この調子でシグナルを処理していくと、そのうちポインタがシグナルボックスの
 末尾に到達する。その場合は次のシグナルは先頭に書かれている。この判定は  末尾に到達する。その場合は次のシグナルは先頭に書かれている。この判定は
 システム側で必要に応じてやっているため、アプリはポインタをインクリメント  システム側で必要に応じてやっているため、アプリはポインタをインクリメント
 するごとにチェックする必要はない。システムがポインタの先頭へのまき戻しが  するごとにチェックする必要はない。システムがポインタの先頭へのまき戻しが
- 必要だと判断するとrewindシグナルが書き込まれます。アプリ側では、これを+ 必要だと判断するとrewindシグナルが書き込まれる。アプリ側では、これを
 受け取ったらポインタを先頭に戻す。  受け取ったらポインタを先頭に戻す。
 + 
 参考になるサンプル:movec2(introa)  参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0060 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0060
Line 41: Line 41:
***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は、アプリがシグナルを処理したことをライブラリに知らせるためのもので、
Line 49: Line 49:
 通知してもよい。単にsignaldwを通知するためだけにlib_waitsignal()を使う時は、  通知してもよい。単にsignaldwを通知するためだけにlib_waitsignal()を使う時は、
 optを0する。  optを0する。
 + 
 スリープのためにlib_waitsignal()を使うときは、この場合シグナルボックスが  スリープのためにlib_waitsignal()を使うときは、この場合シグナルボックスが
 空になっていなければならない。もし1つでもシグナルが残っていれば、  空になっていなければならない。もし1つでもシグナルが残っていれば、
Line 56: Line 56:
 空にする。読み終えたと報告したシグナルを後から読むことは許されないので、  空にする。読み終えたと報告したシグナルを後から読むことは許されないので、
 あとで処理したければ、読み進めるシグナルを別のバッファに転送しておく。  あとで処理したければ、読み進めるシグナルを別のバッファに転送しておく。
 + 
 参考になるサンプル:movec2(introa)  参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f
Line 64: Line 64:
 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はウィンドウを
Line 70: Line 70:
 指定したキーが押されると、signalで指定されたシグナルがシグナルボックスに  指定したキーが押されると、signalで指定されたシグナルがシグナルボックスに
 送られる。  送られる。
 + 
 default_assign1は、基本的にアスキーコードで指定する。' 'や'A'や'('など、これで  default_assign1は、基本的にアスキーコードで指定する。' 'や'A'や'('など、これで
 たいていのキーが指定できる。しかし、カーソルキーやEnterなど、アスキーコードでは  たいていのキーが指定できる。しかし、カーソルキーやEnterなど、アスキーコードでは
Line 83: Line 83:
  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++)
Line 93: Line 93:
 現在のバージョンの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), keytstc0(introc)[拡張キーシグナル]    キーシグナル:movec2(introa), keytstc0(introc)[拡張キーシグナル]
Line 109: Line 109:
 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 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0068_0
Line 121: Line 121:
 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の設定方法は、以下。
Line 131: Line 131:
 実際はハードウェアの都合によりこの96bitの精度が完全に生かされるとは  実際はハードウェアの都合によりこの96bitの精度が完全に生かされるとは
 限らない(限界まで生かす努力はする)。  限らない(限界まで生かす努力はする)。
 + 
 optに0xfを指定した場合、  optに0xfを指定した場合、
 この関数をコールした時刻から指定された時間だけ待った後にタスクは目覚める。  この関数をコールした時刻から指定された時間だけ待った後にタスクは目覚める。
Line 142: Line 142:
 他の処理をする時間もあるからである。0xfを指定すると徐々に誤差が累積されるが、  他の処理をする時間もあるからである。0xfを指定すると徐々に誤差が累積されるが、
 0x7ならそういうことはない。誤差が出る場合は、アプリケーションの問題ではない。  0x7ならそういうことはない。誤差が出る場合は、アプリケーションの問題ではない。
 + 
 本来はこの関数は一定時間待つためのものではなく、時限付きシグナル待ち  本来はこの関数は一定時間待つためのものではなく、時限付きシグナル待ち
 というもので、シグナルがくれば時刻に達していなくてもタスクはスリープから回復する。  というもので、シグナルがくれば時刻に達していなくてもタスクはスリープから回復する。
 シグナル処理をしながら時間を待つもっとも単純な方法はタイマーシグナルを  シグナル処理をしながら時間を待つもっとも単純な方法はタイマーシグナルを
 使うことである。  使うことである。
 + 
 この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい。これは何も  この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい。これは何も
 10ミリ秒単位であることを要請しているわけではない。11.52ミリ秒などでも  10ミリ秒単位であることを要請しているわけではない。11.52ミリ秒などでも
Line 154: Line 154:
 10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは、OSの動作が不安定に  10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは、OSの動作が不安定に
 なるからやってはいけない。  なるからやってはいけない。
 + 
 参考になるサンプル:cntdwnc1(introa)  参考になるサンプル:cntdwnc1(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0018_f
Line 160: Line 160:
***lib_opentimer ***lib_opentimer
 void lib_opentimer(int slot) :  void lib_opentimer(int slot) :
 + 
 タイマーシグナルのために、タイマーをオープンする。slotには0x1c0を指定する。  タイマーシグナルのために、タイマーをオープンする。slotには0x1c0を指定する。
 これはシステムタイマーslot番号で、これをオープンするとlib_waitsignaltime()が  これはシステムタイマーslot番号で、これをオープンするとlib_waitsignaltime()が
Line 168: Line 168:
 タイマーは指定された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 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0070
Line 174: Line 174:
***lib_closetimer ***lib_closetimer
 void lib_closetimer(int slot) :  void lib_closetimer(int slot) :
 + 
 オープンしていたタイマーをシステムに返しスロットを開放します。  オープンしていたタイマーをシステムに返しスロットを開放します。
 クローズ後は、そのタイマーに対する設定はできない。再度オープンしても、  クローズ後は、そのタイマーに対する設定はできない。再度オープンしても、
Line 186: Line 186:
 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は「現在時刻に対する」値と解釈される。
Line 201: Line 201:
 シグナルを発するか、もしくはキャンセルすることによって休止状態に戻るまで  シグナルを発するか、もしくはキャンセルすることによって休止状態に戻るまで
 次の設定はできない。  次の設定はできない。
 + 
 タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様に、間隔が少なくとも  タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様に、間隔が少なくとも
 10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位であることを要請している  10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位であることを要請している
Line 208: Line 208:
 指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性がある。  指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性がある。
 現在のOSASKでは、OSの動作が不安定になるので、やってはいけない。  現在のOSASKでは、OSの動作が不安定になるので、やってはいけない。
 + 
 参考になるサンプル:dblcntc0(introb)  参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_32 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_32
Line 214: Line 214:
***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番号を指定する。
Line 221: Line 221:
 かならずこの関数でキャンセルしてからにすること。  かならずこの関数でキャンセルしてからにすること。
 もともと休止状態にあるタイマーに対し、キャンセルしてもよいが、何も起きない。  もともと休止状態にあるタイマーに対し、キャンセルしてもよいが、何も起きない。
 + 
 参考になるサンプル:dblcntc0(introb)  参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_1 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_1
Line 227: Line 227:
***lib_settimertime2 ***lib_settimertime2
 void lib_settimertime2(int opt, int slot0, int slot1, unsigned int *time) :  void lib_settimertime2(int opt, int slot0, int slot1, unsigned int *time) :
 + 
 2つのタイマーの間の時間差を算出します。timeはunsigned intの配列(もしくはポイ  2つのタイマーの間の時間差を算出します。timeはunsigned intの配列(もしくはポイ
 ンタ)で、最低でも3つの要素が必要です。計算された値が、timeに格納されます。  ンタ)で、最低でも3つの要素が必要です。計算された値が、timeに格納されます。
 + 
     time = slot1 - slot0      time = slot1 - slot0
 + 
 time[0]が下位で、time[2]が上位です。time[1]がちょうど秒の位になります。つまり、  time[0]が下位で、time[2]が上位です。time[1]がちょうど秒の位になります。つまり、
 タイマー設定の際のいつもの単位です。なおこの時に返される値の精度については保証  タイマー設定の際のいつもの単位です。なおこの時に返される値の精度については保証
 しません。おそらくOSASKのバージョンによってまちまちでしょう。  しません。おそらくOSASKのバージョンによってまちまちでしょう。
 + 
 参考になるサンプル:starsc0(introd)  参考になるサンプル:starsc0(introd)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_82 -p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osask/p0cref.html#0078_82
Line 244: Line 244:
 B.休止状態(オープンされているが、時刻がきてもシグナルを発しない)  B.休止状態(オープンされているが、時刻がきてもシグナルを発しない)
 C.待機状態(時刻がくればシグナルを発する)  C.待機状態(時刻がくればシグナルを発する)
 + 
 A状態のタイマーに対してはオープンしかできない。オープンするとB状態になる。  A状態のタイマーに対してはオープンしかできない。オープンするとB状態になる。
 A状態のまま設定を行ってはいけない。  A状態のまま設定を行ってはいけない。
 + 
 B状態のタイマーに対しては各種の設定とクローズができる。設定などによって、  B状態のタイマーに対しては各種の設定とクローズができる。設定などによって、
 B状態のままだったり、A状態になったり、C状態になったりする。  B状態のままだったり、A状態になったり、C状態になったりする。
 + 
 C状態のタイマーに対しては時刻になってシグナルが発生するのを待つか、  C状態のタイマーに対しては時刻になってシグナルが発生するのを待つか、
 キャンセルしかできない。キャンセルするとB状態になる。なお、設定時刻がきて  キャンセルしかできない。キャンセルするとB状態になる。なお、設定時刻がきて

トップ   差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ
新着

目次
メンバー一覧


最新の20件
2016-10-01 2016-09-08
  • @MenuBar.
2016-09-07 2016-09-04 2016-08-15 2015-09-23 2014-07-30 2014-07-04 2014-02-04 2013-10-26 2013-06-21 2013-06-17 2013-06-15 2013-04-02 2013-02-09 2013-02-04 2012-12-25 2012-12-01 2012-05-28 2012-03-31

トピック一覧
一般用コメント最新
新掲示板lina
2016/9/5 20:58
SandBoxゲスト
2016/9/4 12:01
RecentDeletedlina
2015/6/2 19:29
Old-OSASK-MLlina
2014/6/29 9:14
hideyosi/メールhideyosi
2014/1/6 20:17
hideyosi/募集中lina
2013/11/8 19:56

このサイトは川合秀実から委託を受けて、OSASKコミュニティによって管理・運営されています。