前提
プログラムの知識があまりないもので不明点は掘り下げて聞いていただけると助かります。
C# WPF windows FormでInvokeを使用したcallback関数を用いて、非同期処理を行うプログラムを書いています。
ワーカスレッドで取り扱う値が貰い物のref構造体のため、Taskやasync処理などでの処理は難しい状態です。
完了通知用のcallback関数として後述のコードを使っており。
メインスレッドとは異なるスレッドにて、モータを動かす処理を行う関数を実行するたびに下記のcallback関数が呼び出されるようになっています。
(追記)モータを動かすためのライブラリ内に関数は複数種類含まれており、他者が作成したものを使用しています。(内部のコードは参照不可だった。)
①モータを指定の角度分、相対的に動かす②モータを入力した絶対角度になるよう動かす③動作途中で強制停止する(強制停止用のボタンをGUIにも用意しておきたい)
いずれの関数(コマンド)を実行しても、同じcallbackを用いて関数実行(それに応じたモータの移動)完了を待機しようとしております。
問題としては「return true」がcallback通知より早く返されておりいるようで、コマンド処理を待機することができず、解決方法が見つからず困っています。
現在の処理フローは下記のようなイメージです。
(追記箇所)
目的:絶対角度で指定した値と、実際のモータ角度のずれを複数回はかり、最終的に位置を合わせるために相対角度で微調整することを考えている。
0:モータの状態を確認する。モータの状態からコマンドを実行する回数および実行するコマンドの種類を決定する。
①適当な関数を実行する。
②別スレッド(ワーカスレッド)上で処理が始まる。
③~~callback関数の(?)~~コマンド開始を行うと、メインスレッド上でtrueが帰る。(追記、モータが動作を開始した時点でコマンドの受付を行ったといった意図でtrueが返っていた模様。callback関数のtrueが帰るはご認識だった。)
④次の関数が継続して開始される。(本来はcallbackが帰ってくるまでは待機してほしい)以下①~③同様
⑤時間をおいて初めの関数で実施したモータ動作コマンドの処理が完了する。
⑥ ①で実行されたcallback関数が帰ってくる。(この時点で1回分の動作しか行われていない。)
実現したいこと
⑤(Invoke内の完了通知)を、現在の②と③の間(各関数の実行完了通知後に次の関数に移る処理シーケンス)
に実施できるような処理をメインスレッドにて行いたい。
~~(追記)
処理回数については、2回で終わるとは限らず、2回以上複数回繰り返すケースを想定している。
処理の都度、継続が必要か、もしくは終了してよいか判断するように追記していく予定。~~→目的に記載した内容の通り。
該当のソースコード
using function;//関数ライブラリの呼び出し namespace TestGUI { public partial class Control : Form { public function.func lib; //初期化 public ManualControl() { InitializeComponent(); lib = new func();//dllの読み込み lib.SetCallback(CallBack);//dllライブラリ側の処理にcallback関数を登録 } //callback関数 //public bool CallBack(Work.Complete fin) Workは誤り public bool CallBack(func.Complete fin) { this.Invoke((Action)(() => { textBox_Result.Text = fin.Result.ToString() })); return true; } //main処理関数 private void buttonMain_Click(object sender, EventArgs e) { //0番の処理(移動回数、移動コマンドの内容の決定) //1つ目の処理 textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();//ライブラリ側のモータ回転処理 //待機処理を挟みたい箇所 //2つ目の処理 textBox2.Text = lib.calc2(enum_name, integer, ref_struct).ToString(); } } }
試したこと
・ButtonMain関数のTask処理への変更(ref構造体が含まれる処理には使用不可、原因は把握できていない。 CS4012)
・Callback関数そのもののasync/await処理への変更(bool型使用不可の旨のエラー文発生 CS0127)
補足情報(FW/ツールのバージョンなど)
・.NET framework 4.7.2
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー