« 2008年3月 | トップページ | 2008年5月 »

2008.04.28

プロセス間通信ではまる

統合環境のなかでいろいろな子ツールが動くようなことをしようとしています。これが安定してサクサクと軽快に動くようにしたいと思っています。
子プロセス起動の例

子ツールはEXEファイルになっていて、実行結果が親プロセスのメッセージウィンドウに表示されるというものです。
それで、Win32APIのマルチスレッドとかパイプ通信とかやっているのですが、なかなか勝手がつかめず、はまっています。

まず子プロセスを作って、子プロセスの中でprintfした場合に、標準出力を親プロセスに渡すようにしたいのですが、それをやるには、CreateProcess関数のStartupInfo構造体の中に細工すればよいということはわかりました。
親プロセスはCreateProcessに先立ってCreatePipeで匿名パイプを作っておき、STARTUPINFO構造体のhStdOutputにその匿名パイプの入力側を入れます。
つまり、

HANDLE hRead,hWrite;
CreatePipe(&hRead, &hWrite, &sa, 0);
STARTUPINFO startupInfo;
ZeroMemory(&startupInfo,sizeof(startupInfo));
startupInfo.cb=sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
startupInfo.hStdOutput = hWrite;
startupInfo.hStdError = hWrite;
CreateProcess(NULL,cmdFileName,NULL,NULL,TRUE,
NORMAL_PRIORITY_CLASS,NULL,NULL
,&startupInfo,&processInfo

これで、子プロセスがprintfしたものが次々と匿名パイプに入ってきます。親プロセスではhReadからどんどん読み出して、自分のメッセージウィンドウなどに表示してやればよいのです。

しかし、Windowsでは、パイプの監視が一筋縄ではいかないということがわかってきました。
有名なAPI関数にWaitForSingleObjectというのがありますが、これはパイプは監視できないようです。

そのため、ループ中で常にパイプの監視をしてやらなければならないのですが、ずっと監視しているとCPUの使用率が上がります。要はパイプに何かのデータが来たらイベントを発生させたいのですが、イベントを発生させるにしても、やはり常にパイプを監視していなければなりません。ここはマルチスレッド化しても同じです。

さて、Borland C++ Builderを使っているときにはメインのスレッド(ボタン押したときの処理などをするスレッド)は止めるとよくないので長時間止めるときには、Application->ProcessMessage()を呼び出さないと、画面が固まったようになってしまいます。

メインスレッドでWaitForSingleObjectの関数を使っても画面が固まるようです。子プロセス起動とかするとさらにややこしくなります。子プロセスの監視を子スレッドにやらせた場合、ButtonやMemoなどのコンポーネントに文字を表示させたい場合、親スレッドが停止していると更新されないようです。

つまり、親スレッドは常に動いてApplication->ProcessMessage()をしていなければならないようなのです。子スレッドの終了監視もしなければならない。CPU使用率を下げるために親スレッドを止めると、Memoなどへの表示更新も遅くなる。
これを回避するには、メインのスレッドで動く関数は子スレッドを起動したら監視などせずにすぐに制御を返せばよいのですが、これでは子プロセスの終了待ちができません。子プロセスが終了を以って何らかの処理をするには、子プロセスが終了したときに何かのイベント(Borlandのイベント)を起こしてやらなければなりません。
この処理では1つの関数ではできず、子スレッドを起動するまでと、子スレッド終了以降とにわけで、2つ以上の関数にしなければなりません。これは面倒。

つまり、以下3つのことが同時に成り立たないようです。
・表示が速やかに更新されること
・CPU使用率を下げること
・コードを簡単にすること

さて、起動した子プロセスと通信するには名前付きパイプなどの手段を使いますが、やはり名前付きパイプはWaitForSingleObjectで待てないので、パイプと一緒にイベントも作ってやらねばなりません。
つまり、パイプに何かを書いたらSetEventでイベントを発生させて、それを知らせてやらねばなりません。
これらはWindows APIのCreateNamedPipeやCreateEventを使いますが、CreateNamedPipe関数もCreateEvent関数も成功するとハンドルを返します。
しかし、CreateEvent関数は失敗するとNULLを返し、
CreateNamedPipe関数はINVALID_HANDLE_VALUE(=0xFFFFFFFF)を返します。
なんてややこしい。

OpenEventは、どうやら親スレッドが作ったEventを子スレッドでも使う場合に用いる関数のようです。親子スレッドでイベントを共有する場合、面倒だからとCreateEventだけで済ませてHANDLEだけを渡すと、なんだか変なことになるようです。
全く別個に起動したプログラム同士でイベントを共有するには、同じ名前でCreateEventをすればよいようです。果たしてそれでよいのかまだ不明。ちなみに、名前を同じにしてもOpenEventでは開けませんでした。

このあたりの仕組みがだんだん理解できてきました。

| | コメント (3)

2008.04.18

展示会 ご来場ありがとうございました!

天候がすぐれない中、展示会にご来場いただき、ありがとうございました!
おかげさまで大盛況でした。
今までに出た展示会の中で一番の手ごたえを感じました。
最終日は16時30分ごろまで人が途切れませんでした。

Illustratorと格闘しながら頑張って作ったパンフレットも、アルバイトさんが頑張ってくれたおかげで、1000枚近く配ることができました。今回のパンフレットは紙質変更オプションを使って見栄えの良い紙にしたので、搬入のときちょっと重かったです。撤収のときにはおかげさまで驚くほど軽くなっていました。

人が少ないときに、自分のブースの写真を撮りました
Board2008_1
Board2008_2
毎年いろんな展示会に出ているのですが、ブースの構成も、だいぶん、まとまってきました。
やはりうちは、MITOUJTAG1本に絞って出展するのが一番だと感じました。
ただ、写真を見て分かるように、配線が目立っているのでこれをなんとかしたいですね。今回は印刷物を頑張ったので、次回は小物類に凝ってみたいです。

今回の展示ではMITOUJTAG Pro.版を出展しましたが、これがかなり好評をいただいたと実感しております。
「FPGAが論理合成せずに動くってどういうこと!?」とよく聞かれました。
FPGAのI/O端子の動作見えたり、パソコンから操作できたり、C言語で気楽にFPGAの動作を変えられるという説明をさせていただきました。FPGAの論理合成とかコンフィギュレーションせずに、パソコン上で計算したとおりにFPGAの動かします。このときバウンダリスキャンで実機を動かすので、FPGAの品種やメーカーは問いません。だから、ソースをパソコン上で書きかえれば一瞬でFPGAの動作が変わります。こういった仕組みを使いやすい形で提供しています。
早速、商社様経由でお引き合いをいただきました。ありがとうございます。

また、なひたふ新聞を見て来られたという方も5名ほどいらっしゃいました。
長年のご愛顧ありがとうございます。

次の展示会は5月の末に行われるIPAXを予定しております。
IPAXではMITOUJTAG Pro.に磨きをかけて出展予定です。

今後とも特殊電子回路ならびにMITOUJTAGをよろしくお願いします。

| | コメント (0)

2008.04.16

MITOUJTAG Pro 間に合った!

今日からボードコンピュータ展です。

ぎりぎりですが、MITOUJTAG Proも間に合いました。
MITOUJTAG ProはMDIアプリケーションで、中にいろんなウィンドウが開きます。

展示会開始1時間前に、バウンダリスキャン、JTAGロジアナ、アドバンスドJTAGファンクションジェネレータなどなどを統合することができました。
Mjpro

では、これから会場に向います。

会場で皆様にお会いできることを楽しみにしています。
ご意見などいただければ幸いです。

| | コメント (0)

2008.04.12

Illustratorを使ってみた

パンフレットや展示会用のパネルを作るため、Adobe Illustrator CS3を買いました。

実際に買ったのは2ヶ月ほど前で、アルバイトの人に触ってもらってパンフレットの草稿のようなものを作ってもらっていたのですが、結局最後は自分でIllustratorの勉強をしなければならないということになりました。

そういうわけで、徹夜でパンフレット作りです。細かいずれを直したり、変な特色が出来てしまっているのを直したり、トンボマークをつけなおしたりと、Illustartorの参考書(?)を見ながら一晩かけてやっていました。
どうやらトンボマークをつけるには3つの方法があって、A4サイズの四角いオブジェクトを作ってその周囲に「フィルタ->トリムマーク」でつける方法、「オブジェクト->トリムエリア->作成」で表示する方法、それから、自分で描く方法があるのですね。どのトンボが良いかは印刷屋さん依存のようです。

スウォッチとかなじみの無い単語がいっぱい出てますし、「別名で保存」と「複製を保存」の違いとか最初わからなくて戸惑いました。いやー、大変。
PDFに変換したらサイズが20MBytesを超える巨大なものができあがるし、なぜだー。
そんなことやっていたら、だんだんIllustratorが理解できるようになってきました。

いや、しかしまだ塗りつぶしの設定ができません。斜線で網掛けしながら塗りつぶす方法がわからないし、矢印描くにもWordやExcelのオートシェイプみたいなものも欲しい。

そんなこんなで苦戦しながらも、なんとかパンフレットが2種類出来上がりました。

MITOU JTAG BASICパンフレット

MITOU JTAG Pro.パンフレット

今日の朝、印刷屋さんにデータを送稿したので、火曜日には届くようです。
仕上がりが楽しみです。

さて、MITOUJTAG Pro.と、体験版1.50を作らなければ!

| | コメント (0)

« 2008年3月 | トップページ | 2008年5月 »