FC2ブログ
*admin*entry*file*plugin| 文字サイズ  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



主要な機能は大体乗せたのであとは実機で
通信しての調整が必要になるわけですが。
この通信でおそらく必要となる機能のひとつに
マルチスレッドがあります。今日はこのお話。

送信するにしても受信するにしてもwhileとかfor
でぐるぐる回して通信します。その時なんにも
していないとフリーズ状態に陥ります。
この回避の手段としてマルチスレッドをつかいます。
やることはたぶんこんな感じ

・フリーズの原因になる処理を新しいスレッドとして定義
・こいつをバックグラウンドで動かす
・割り込みの処理を仕込んでおく

たぶんこの3つだと思うのだけど。
最後のが必要なのは途中で止めたいっていう時に必要だから
で、書くソースはこんな感じに
作ってるのはVC++のフォームアプリ


using namespace System::Threading;


まずこれが必要、これないと動かない。


Thread^ Read = gcnew Thread(gcnew ThreadStart(this, &Form1::Read));
Read->IsBackground = true;
Read->Start();


こんな感じで書いてみる、どうも変数の代入は無理らしい。
なんかエラーが出て上手くいかない。test(int i)ってやつね
(int i)ではなく()にしておかないといけないみたい。
コレ出来ると結構便利なんだけど、別の記述なのだろうか?
今回はなくても特に問題はなさそうだけど。
そして割り込み処理はDelegateを使うといいらしい。


private: delegate System::Void ReadDataDelegate(String^ tx);//関数+Delegateって名前にしてみる
private: System::Void ReadData(String^ tx){//実際処理するやつ
//なんか書く
}

BeginInvoke(gcnew ReadDataDelegate(this, &Form1::ReadData), tx);//使うときはこうなる



まずDelegateで代入する変数を決めておく、別に変数無くてもいい。
実際のところDelegateじゃなくてもただの名前だから何でもいい。
勝手に「関数 + Delegate」って名前にしてるだけ。
そしてその下辺りに処理する関数を作っておく。
これを使うのはバックグラウンドで動いてる処理では
テキストボックスとかにアクセスが出来ないから。
ただ、メッセージボックスは普通に動くみたい。

で、実際の割り込みはバックグラウンド処理から「BeginInvoke」
をつかってDelegateの処理を呼び出します、これは見れば判るか。
今回通信処理をしているわけですが、ReadFileの待ち時間は
「0」に設定しています。つまり信号を受け取っていようがいまいが
値を返してReadFileから抜け出します。ReadFileで永遠に待つという
処理も可能ですが、その場合ReadFileから出てこないから
その後の処理ができなくなるのであまりおすすめできない。

ReadFileも作ったソースならいいのだけどそうじゃないから
下手に弄れないし、なのですぐに出て値持ってないかどうかで
処理を分岐させるという方法をとっているわけです。


こんな感じでマルチスレッドの処理をしたわけですが、
実は以前にも似たような事がありまして。なんかやった覚えがと感じ
つつもコーディングをしてました。ほんとソースどこ行ったよ(´・ω・`)
そしてようやく実機でのテスト通信をすることになりいろいろ
やってました。うむ、想定の範囲内の修正でどうにかなりそう。
このぐらいのソフトならフリーで転がってますが、私自身が作ることで
好きに編集できるという大きな利点がありこうなってます。
中途半端に通信できるとどこをどう修正したらいいのか解らないので。

今回NC機との通信ソフトを自作しているわけですが、障害はほぼ解消
されたのであとはなるようになるのではないかと。このソフトももちろん
必要な物なのですが、もう一つ欲しいものがあったりします。
それはGコードからの描画機能を持ったソフトです。
一応、CAD/CAM入ってるので軌跡の描画自体は可能です、可能ですが
Gコード吐いたらそのままという丸投げっぷり。
高価なソフトのくせして肝心なところでは役立たず。

理想:Gコード→描画(Gコードを追尾)
現実:描画→Gコード

実際のところGコードからの描画が現場としては一番欲しいところ。
欲を言うと相互変換できると更にいいけどまぁこれは無くてもなんとかなる。
アプローチの向きが逆なんですよ、なんでこんな仕様にしてるの?
現時点でもあるにはあるのですが3軸までで4軸つまりB軸が入ると機能しない
とか、FANUCのフォーマットしか対応していないとかIとJが効かないとか、
色々と使いにくい癖があるようで。でもさすがにこれを作るのは大変そう。

DirectXとかOpenGL等で画面への描画処理しないといけないから。
残念ながらこの手の処理をコーディングしたことはないのです。
(Gコード自体はすんごい単純だからそこの処理は大した問題ではない)
できなくはないと思うけど一筋縄ではいかないよねぇ・・・
そこまで時間が費やせればいいけど、暇があれば片鱗だけでも作るかも?
たしかDirectX11の本買ってたような気もするのだけど見当たらない。




さて、もうじきお引越しなので更にドタバタ感が増しております。
落ち着くのは来月の第二週辺りかなぁ。


この記事へコメントする















Mithril

Author:Mithril


趣味は主に雑学です。
どうでもいいこと書いてます。

Blenderやプログラムに
ついても書いたりするかも。
私のPC環境はこちら

メールはこちらから↓
mithrilp★yahoo.co.jp
(★を@に変えて下さい)

09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。