SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|

2004-07-12(Mon) 一気に準完成形へ

  今日は窓使いの憂鬱でUSBドライバを使う設定にして、昨日購入したUSBテンキーを試してみた。なんだ、ちゃんとスキャンコードを出すようになるじゃないの。USBドライバを使うということは、若干違うレイヤーでキー入力をフックするということだったのね。一応、これで設定を煮詰めれば解決である。Keiboardも使用できるようになったので、キーアサインはこんな感じにしてみた。

keymap Global
 key F6		= A-Tab						# プロセス切り替え
 key F8		= A-Tab						# プロセス切り替え
window	ProAtlas	/proatlasw2\.exe:ProAtlasW2MainFrame*/ : Emacsen
 key Space	= LMenu G S C Tab Tab Tab Tab Enter		# GPSロック(現在地)
 key _6		= Right
 key _4		= Left
 key _2		= Up
 key _8		= Down
 key _5		= Return					# 決定
 key _1		= PageUp					# 広域
 key _3		= PageDown					# 詳細
 key _0		= Home						# 自宅
 key _7		= LMenu V R S					# 昼色
 key _9		= LMenu V R N					# 夜色
 key BackSpace	= F11						# 全画面表示
 key Delete	= LMenu M Down Down Down Down			# Myフォルダ(経路呼出)

  次は、昨日のジュークボックスアプリの開発の続き。Thread内部からラベルコントロールを変更するとウィンドウ内の表示が崩れてしまう件だが、どうやら根が深そうである。この問題はおそらく、systemで外部コマンドを呼ぶと、内部的にforkが呼ばれるため、一瞬双方のプロセスが勝手にウィンドウの更新を行おうとして干渉し、表示が崩れているっぽい。systemを使っている以上どうしようもないと思って、自前でforkして、子プロセスの方でウィンドウの更新を避けようとか、いろいろやってみたのだが、どうにもお手上げである。

  というか、そもそもThreadとforkを同時に使うというのもかなり不自然なわけであるからして、ここはスッパリあきらめて、別の方法を採ることにした。別の方法とは、別途サウンドを司るDaemon(デーモン)を作成し、Ruby/tk側からはソケット通信にてDaemonに要求を送信、Daemonがmediaplayを立ち上げるというものである。ここで、Daemonというとなんかデカいプログラムのように思えるが、なんのことはない、これも100行チョイのRubyスクリプトである。しかも、別途必要があって開発途中だったものなので、ちょいとイジって、Ruby/tk側のsystem文をソケット通信文に変更するだけである。

  と、いうわけで、あっけなくウィンドウ表示の崩れる件は解消したので、次は曲ごとに右下の経過時刻がリセットされる処理を追加する。これには、Daemonとの通信Threadから、経過時刻表示Threadへ「次の曲にかわったよ」ということを知らせるThread間通信が必要となる。ところがThread間通信という言葉が先行してしまったため難しく考えてしまってどうにもうまくいかない。そこで、細かいこと考えずに、あらかじめ空Hashインスタンスを両Threadに渡しておいて、それを書き換えるようにしたらサクッとうまくいった。なんだ、アホくさ。解決。その勢いで、Keiboardからの操作を可能にするイベント処理も中途半端ながら実装する。

  画像の説明

  これで、完成度90%である。既に指定のディレクトリ内のメディアファイルをエンドレスで次々に曲を演奏するところまできた。うほほい。