質問編集履歴
9
現在の自分で可能な限り説明ができる内容を、追記しました。
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
|
-
メインスレッドとは異なる
|
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
目的(実現したいこと)を追記
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
|
-
//
|
45
|
+
//public bool CallBack(Work.Complete fin) Workは誤り
|
42
46
|
public bool CallBack(func.Complete fin)
|
43
47
|
{
|
44
48
|
this.Invoke((Action)(() =>
|
7
ライブラリ読み込み追記
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関数の引数を修正
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(
|
40
|
+
public bool CallBack(func.Complete fin)
|
40
41
|
{
|
41
42
|
this.Invoke((Action)(() =>
|
42
43
|
{
|
5
試したことを修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -63,7 +63,7 @@
|
|
63
63
|
|
64
64
|
### 試したこと
|
65
65
|
|
66
|
-
・ButtonMain関数
|
66
|
+
・ButtonMain関数のTask処理への変更(ref構造体が含まれる処理には使用不可 CS4012)
|
67
67
|
・Callback関数そのもののasync/await処理への変更(bool型使用不可の旨のエラー文発生 CS0127)
|
68
68
|
|
69
69
|
### 補足情報(FW/ツールのバージョンなど)
|
4
ソースコード表示修正
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
コメントを追記
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で書いていました。すみません。
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
|
-
|
48
|
+
//main処理関数
|
44
|
-
|
49
|
+
private void buttonMain_Click(object sender, EventArgs e)
|
50
|
+
{
|
45
|
-
|
51
|
+
//1つ目の処理
|
46
|
-
|
52
|
+
textBox1.Text = lib.calc1(enum_name, integer, ref_struct).ToString();
|
53
|
+
//待機処理を挟みたい箇所
|
47
|
-
|
54
|
+
//2つ目の処理
|
48
|
-
|
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タグ追加
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
|
+
|