質問編集履歴

9

現在の自分で可能な限り説明ができる内容を、追記しました。

2023/01/23 13:22

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -4,25 +4,33 @@
4
4
  C# ~~WPF~~ windows FormでInvokeを使用したcallback関数を用いて、非同期処理を行うプログラムを書いています。
5
5
  ワーカスレッドで取り扱う値が貰い物のref構造体のため、Taskやasync処理などでの処理は難しい状態です。
6
6
 
7
- 完了通知用のcallback関数として下記を使っており。
7
+ 完了通知用のcallback関数として後述のコードを使っており。
8
- メインスレッドとは異なるワーカスレッドにて処理を行う関数を実行するたびに下記のcallback関数が呼び出されるようになっています。
8
+ メインスレッドとは異なるスレッドにて、モータを動かす処理を行う関数を実行するたびに下記のcallback関数が呼び出されるようになっています。
9
+ (追記)モータを動かすためのライブラリ内に関数は複数種類含まれており、他者が作成したものを使用しています。(内部のコードは参照不可だった。)
10
+ ①モータを指定の角度分、相対的に動かす②モータを入力した絶対角度になるよう動かす③動作途中で強制停止する(強制停止用のボタンをGUIにも用意しておきたい)
11
+ いずれの関数(コマンド)を実行しても、同じcallbackを用いて関数実行(それに応じたモータの移動)完了を待機しようとしております。
12
+
9
- 問題としては「return true」が通知より早く返されてしまい、処理を待機する方法が見つからず困っています。
13
+ 問題としては「return true」がcallback通知より早く返されて~~おり~~るようでコマンド処理を待機することができず、解決方法が見つからず困っています。
10
14
 
11
15
  現在の処理フローは下記のようなイメージです。
16
+ (追記箇所)
17
+ 目的:絶対角度で指定した値と、実際のモータ角度のずれを複数回はかり、最終的に位置を合わせるために相対角度で微調整することを考えている。
18
+ 0:モータの状態を確認する。モータの状態からコマンドを実行する回数および実行するコマンドの種類を決定する。
12
19
 
13
20
  ①適当な関数を実行する。
14
21
  ②別スレッド(ワーカスレッド)上で処理が始まる。
15
- ③callback関数のtrueが帰る。
22
+ ~~callback関数の(?)~~コマンド開始を行うと、メインスレッド上でtrueが帰る。(追記、モータが動作を開始した時点でコマンドの受付を行ったといった意図でtrueが返っていた模様。callback関数のtrueが帰るはご認識だった。)
16
- ④次の関数が継続して開始される。以下①~③同様
23
+ ④次の関数が継続して開始される。(本来はcallbackが帰ってくるまでは待機してほしい)以下①~③同様
17
- ⑤時間をおいて初めの関数で実施した処理が完了する。
24
+ ⑤時間をおいて初めの関数で実施したモータ動作コマンドの処理が完了する。
25
+ ⑥ ①で実行されたcallback関数が帰ってくる。(この時点で1回分の動作しか行われていない。)
18
26
 
19
27
  ### 実現したいこと
20
28
  ⑤(Invoke内の完了通知)を、現在の②と③の間(各関数の実行完了通知後に次の関数に移る処理シーケンス)
21
29
  に実施できるような処理をメインスレッドにて行いたい。
22
30
 
23
- (追記)
31
+ ~~(追記)
24
32
  処理回数については、2回で終わるとは限らず、2回以上複数回繰り返すケースを想定している。
25
- 処理の都度、継続が必要か、もしくは終了してよいか判断するように追記していく予定。
33
+ 処理の都度、継続が必要か、もしくは終了してよいか判断するように追記していく予定。~~→目的に記載した内容の通り。
26
34
 
27
35
 
28
36
 
@@ -55,6 +63,7 @@
55
63
  //main処理関数
56
64
  private void buttonMain_Click(object sender, EventArgs e)
57
65
  {
66
+ //0番の処理(移動回数、移動コマンドの内容の決定)
58
67
  //1つ目の処理
59
68
  textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();//ライブラリ側のモータ回転処理
60
69
  //待機処理を挟みたい箇所
@@ -70,7 +79,7 @@
70
79
 
71
80
  ### 試したこと
72
81
 
73
- ・ButtonMain関数のTask処理への変更(ref構造体が含まれる処理には使用不可 CS4012)
82
+ ・ButtonMain関数のTask処理への変更(ref構造体が含まれる処理には使用不可、原因は把握できていない。 CS4012)
74
83
  ・Callback関数そのもののasync/await処理への変更(bool型使用不可の旨のエラー文発生 CS0127)
75
84
 
76
85
  ### 補足情報(FW/ツールのバージョンなど)

8

目的(実現したいこと)を追記

2023/01/21 07:55

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,11 @@
18
18
 
19
19
  ### 実現したいこと
20
20
  ⑤(Invoke内の完了通知)を、現在の②と③の間(各関数の実行完了通知後に次の関数に移る処理シーケンス)
21
- に実施できるような処理をメインスレッドにて行いたい
21
+ に実施できるような処理をメインスレッドにて行いたい
22
+
23
+ (追記)
24
+ 処理回数については、2回で終わるとは限らず、2回以上複数回繰り返すケースを想定している。
25
+ 処理の都度、継続が必要か、もしくは終了してよいか判断するように追記していく予定。
22
26
 
23
27
 
24
28
 
@@ -38,7 +42,7 @@
38
42
  lib.SetCallback(CallBack);//dllライブラリ側の処理にcallback関数を登録
39
43
  }
40
44
  //callback関数
41
- // public bool CallBack(Work.Complete fin) Workは誤り
45
+ //public bool CallBack(Work.Complete fin) Workは誤り
42
46
  public bool CallBack(func.Complete fin)
43
47
  {
44
48
  this.Invoke((Action)(() =>

7

ライブラリ読み込み追記

2023/01/19 16:16

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -24,10 +24,12 @@
24
24
 
25
25
  ### 該当のソースコード
26
26
 
27
+ using function;//関数ライブラリの呼び出し
27
28
  namespace TestGUI
28
29
  {
29
30
  public partial class Control : Form
30
31
  {
32
+ public function.func lib;
31
33
  //初期化
32
34
  public ManualControl()
33
35
  {

6

ソースコードのcallback関数の引数を修正

2023/01/19 16:09

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -36,7 +36,8 @@
36
36
  lib.SetCallback(CallBack);//dllライブラリ側の処理にcallback関数を登録
37
37
  }
38
38
  //callback関数
39
+ // public bool CallBack(Work.Complete fin) Workは誤り
39
- public bool CallBack(Work.Complete fin)
40
+ public bool CallBack(func.Complete fin)
40
41
  {
41
42
  this.Invoke((Action)(() =>
42
43
  {

5

試したことを修正

2023/01/19 16:06

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -63,7 +63,7 @@
63
63
 
64
64
  ### 試したこと
65
65
 
66
- ・ButtonMain関数(lib.calc1,lib.calc2)のTask処理への変更(ref構造体を用いた処理には使用不可? 記録控えなし)
66
+ ・ButtonMain関数のTask処理への変更(ref構造体が含まれる処理には使用不可 CS4012)
67
67
  ・Callback関数そのもののasync/await処理への変更(bool型使用不可の旨のエラー文発生 CS0127)
68
68
 
69
69
  ### 補足情報(FW/ツールのバージョンなど)

4

ソースコード表示修正

2023/01/19 13:59

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  ### 該当のソースコード
26
26
 
27
- namespace TestGUI
27
+ namespace TestGUI
28
28
  {
29
29
  public partial class Control : Form
30
30
  {
@@ -41,7 +41,7 @@
41
41
  this.Invoke((Action)(() =>
42
42
  {
43
43
  textBox_Result.Text = fin.Result.ToString()
44
- }));
44
+ }));
45
45
  return true;
46
46
  }
47
47
 
@@ -50,8 +50,8 @@
50
50
  {
51
51
  //1つ目の処理
52
52
  textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();//ライブラリ側のモータ回転処理
53
- //待機処理を挟みたい箇所
53
+ //待機処理を挟みたい箇所
54
- //2つ目の処理
54
+ //2つ目の処理
55
55
  textBox2.Text = lib.calc2(enum_name, integer, ref_struct).ToString();
56
56
  }
57
57
  }

3

コメントを追記

2023/01/19 13:53

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -32,8 +32,8 @@
32
32
  public ManualControl()
33
33
  {
34
34
  InitializeComponent();
35
- lib = new func();
35
+ lib = new func();//dllの読み込み
36
- lib.SetCallback(CallBack);
36
+ lib.SetCallback(CallBack);//dllライブラリ側の処理にcallback関数を登録
37
37
  }
38
38
  //callback関数
39
39
  public bool CallBack(Work.Complete fin)
@@ -49,7 +49,7 @@
49
49
  private void buttonMain_Click(object sender, EventArgs e)
50
50
  {
51
51
  //1つ目の処理
52
- textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();
52
+ textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();//ライブラリ側のモータ回転処理
53
53
  //待機処理を挟みたい箇所
54
54
  //2つ目の処理
55
55
  textBox2.Text = lib.calc2(enum_name, integer, ref_struct).ToString();

2

WPFでなくFormで書いていました。すみません。

2023/01/19 13:49

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,7 @@
1
1
  ### 前提
2
2
  プログラムの知識があまりないもので不明点は掘り下げて聞いていただけると助かります。
3
3
 
4
- C# WPFでInvokeを使用したcallback関数を用いて、非同期処理を行うプログラムを書いています。
4
+ C# ~~WPF~~ windows FormでInvokeを使用したcallback関数を用いて、非同期処理を行うプログラムを書いています。
5
5
  ワーカスレッドで取り扱う値が貰い物のref構造体のため、Taskやasync処理などでの処理は難しい状態です。
6
6
 
7
7
  完了通知用のcallback関数として下記を使っており。
@@ -23,36 +23,48 @@
23
23
 
24
24
 
25
25
  ### 該当のソースコード
26
- //初期化
27
- public ManualControl()
28
- {
29
- InitializeComponent();
30
- lib = new func();
31
- lib.SetCallback(CallBack);
32
- }
33
- //callback関数
34
- public bool CallBack(Work.Complete fin)
35
- {
36
- this.Invoke((Action)(() =>
37
- {
38
- textBox_Result.Text = fin.Result.ToString()
39
- }));
40
- return true;
41
- }
42
26
 
27
+ namespace TestGUI
28
+ {
29
+ public partial class Control : Form
30
+ {
31
+ //初期化
32
+ public ManualControl()
33
+ {
34
+ InitializeComponent();
35
+ lib = new func();
36
+ lib.SetCallback(CallBack);
37
+ }
38
+ //callback関数
39
+ public bool CallBack(Work.Complete fin)
40
+ {
41
+ this.Invoke((Action)(() =>
42
+ {
43
+ textBox_Result.Text = fin.Result.ToString()
44
+ }));
45
+ return true;
46
+ }
47
+
43
- //main処理関数
48
+ //main処理関数
44
- private void buttonMain_Click(object sender,EventArgs e){
49
+ private void buttonMain_Click(object sender, EventArgs e)
50
+ {
45
- //1つ目の処理
51
+ //1つ目の処理
46
- textBox1.Text =lib.calc1(enum_name,integer ,ref_struct).ToString();
52
+ textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();
53
+ //待機処理を挟みたい箇所
47
- //2つ目の処理
54
+ //2つ目の処理
48
- textBox2.Text =lib.calc2(enum_name,integer ,ref_struct).ToString();
55
+ textBox2.Text = lib.calc2(enum_name, integer, ref_struct).ToString();
49
- }
56
+ }
57
+ }
58
+ }
59
+
60
+
61
+
50
62
 
51
63
 
52
64
  ### 試したこと
53
65
 
54
- ・ButtonMain関数のTask処理への変更(ref構造体を用いた処理には使用不可)
66
+ ・ButtonMain関数(lib.calc1,lib.calc2)のTask処理への変更(ref構造体を用いた処理には使用不可? 記録控えなし)
55
- ・Callback関数のasync/await処理への変更(bool型使用不可)
67
+ ・Callback関数もののasync/await処理への変更(bool型使用不可の旨のエラー文発生 CS0127)
56
68
 
57
69
  ### 補足情報(FW/ツールのバージョンなど)
58
70
  ・.NET framework 4.7.2

1

初心者マーク追加、invokeタグ追加

2023/01/18 23:49

投稿

acro_shachi
acro_shachi

スコア1

test CHANGED
File without changes
test CHANGED
@@ -57,4 +57,4 @@
57
57
  ### 補足情報(FW/ツールのバージョンなど)
58
58
  ・.NET framework 4.7.2
59
59
  ここにより詳細な情報を記載してください。
60
- > 引用テキスト
60
+