[2017年7月28日]
USBカメラ8台切替プログラムの、虫取り
7、8台の「USBカメラ」を3〜5秒間隔で切り替えて映像を表示させるプログラムを自作しているのだが、時間が経つと突然暴走する“プログラムのバグ/虫”を、なかなか取り除けなかった。
この虫は、もしかしたら「ハンドル・リーク」が主な原因ではないか?と。
(別途「メモリ・リーク」というのもあるらしいが、それとは違うようだし)
どうやら、USBカメラ群を切り替えながら、それらからのキャプチャ映像を表示させていると、自然増大するらしいと見た。(私見だが)
現実には、起動時300前後だった「ハンドル数」が、時間が経つに連れて鰻上り、やがては1万以上にまで増えてしまう!
流石に、その辺りになると、(鷹揚な?)OSや介在ルーチンでも管理し切れなくなるようで、カメラに向かって“アンタ誰?”とかしつこく問い始める。結果、それの繰り返しが“致命的なエラー”になるわけだ。(苦笑)
「ハンドル・リーク」などは、普通に増えたり減ったりするものだそうだが、あまり多量に増殖させてはいけない!ものらしい、...が、そんな事言われてもー...出るモノは出る!(泣笑)
やっと見付けた解決策は、一旦プログラムを終了させ、また再起動させてやる方法だ。
そうすれば、「ハンドル数」は「初期値」に戻る!...(素人的な)拙手ながら妙手だったりして。
これで、1日中プログラムを働かせていても、途中で勝手に落ちることはなくなるだろう。また、落ちても自動復活が出来る!(多分!?)
(...でも、屋外カメラ群での“「USBコネクタ」の緩み”や“延長&中継距離が長いカメラ”などで起きる不測のエラーは完全には取り除けていないので、まだまだ継続課題は多い)
動画の説明(動画1<クリック>):
いきなり現れる“松林風景”はPCの壁紙だが、この時は本プログラム「UCam8.exe」の終了&再起動が始まっている。(6〜8秒間)
次に、左上にちっちゃな細長「主メニュー」が出て、これの[開始]ボタンを自動的に押すようにしてあり、プログラムが自動的に再起動している。
右上に出した中窓は、「Windowsタスクマネジャー」(Ctrl+Shift+Escキー3個押し)で、これで、メモリ使用状況やハンドル数、スレッド数などを観測することが出来る。
「UCam8.exe」の終了時&再起動時には、2つの同じプロセス「UCam8.exe」が現れて、旧い1つが消えるのが見える(かもしれない)。
−−−−−−−−−−−−−−−−−−−−−−−−−
プログラムUCam8.exe(の部分)
“プログラムを終了&再起動させる”ことは、(私にとっては)かなり難題だ!と思っていたのだが、ネット上での様々なQ&Aを拝見している内に、再起動なんて簡単らしい!と分かって来た。
メモリ上で走っているこのプログラム(UCam8.exe)とハードディスク上にあるプログラム(UCam8.exe)は、一応“別物”と考えて、メモリ上で走っているプログラムから、ハードディスク上のプログラムを読み出して、それを“実行”させ、同時に今メモリ上で走っているプログラムを“終了”させれば、“再起動をした”のと(ほぼ)同じことになるわけだ!
その部分が、図2。
少し“時間待ち(cv::waitKey(3000) 約3秒間)”を入れてあるのは、新しいUCam8.exeが立ち上がるまでの間、旧い静止画を残しておこう!と考えたからで、もしこれをゼロにしてしまうと、壁紙表示(ブランク状態)だけの時間が長〜く感じられるからだ。(6〜8秒間)
今回、タイマーを2個備えた。(図3<クリック>)
1個は、「カメラ映像を表示しておく時間」を決めるためのタイマー(1〜60秒)で、処理はGtフラグをON/OFFするだけ。
これは、「映像表示ルーチン」が完全に終ってから、次の処理に入る為だ。(そうしないと、動作が可笑しくなる)
もう1個は、一人二役をさせていて、初めの[開始]ボタンの自動押し下げと、その後の長周期(約20〜40分周期を図とは別の箇所で設定)の「再起動」用に、この第2タイマーを使っている。
蛇足だが、「主メニュー」(Form1)上に置いた[押しボタン]は、人間の手で押さない限り働かないものだと思っていたのだが、タイマーを使えば自動で押し下げが可能になることが分かった!(素人の大発見だ!笑)
(こうした小技は、ネット上でもなかなか見付からず/教われず、やはり自分で(再)発見しないとダメみたい)
エラーの実情
今回、やっと押さえ込めたエラーは、図4のような“アンタ誰?エラー”だが、これは、どうやら“仲介ルーチン”が出している“ハンドル不一致”の「エラー・メッセージ」らしい。
(プログラムUCam8.exeでは、こんなメッセージを出すようにはしてないもんな!)
時間が経つほど増えて行く「ハンドル数」が、やがて極端に多くなり過ぎて、うまく割り振れなくなった結果、(“アンタ誰?”になる)ではないか?と想像している。
通常は、そうした「ハンドル・リーク」が生じないようにプログラムを組むのが、“正しいやり方!”だそうだが、UCam8.exeの何処をどう弄くっても、改善の兆候無し。
...素人的な窮与の一策で、エラー発生が起きる前に、プログラム(UCam8.exe)を停止&再起動すればどうか?と考えた。
そうすれば、「ハンドル数」の増大はリセットされるから、エラー発生は起き難くなるはず。
・・・そこで、“停止&再起動”処置をやってみたら、確かに、エラー発生は減った/無くなったようだ!!!
実は、このトラブル以外にも、状況が異なるエラーも起きていた(図5<クリック>)のだが、今は、殆ど見られなくなっている。
もしかしたら、同じ原因(「ハンドル・リーク」?)なのかもしれない。結構!結構!
今回の“対策済プログラム”で、長時間試験及び、屋外カメラ群を使った試験を続けてみようと思っている。