C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C++/CLI delegate 関数の戻り値取得方法につい

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■88427 / inTopicNo.1)  C++/CLI delegate 関数の戻り値取得方法につい
  
□投稿者/ びぎなー青ドンちゃん (1回)-(2018/08/29(Wed) 21:10:51)

分類:[.NET 全般] 

お世話になります。

環境:Windows 10
   Visula Studio 2017
使用言語:C++/CLI


にて画像処理系の開発をしております。
デリゲート(BeginInvoke)を使用し並行処理できないかと試していましたところ行き詰ってしまいました。


デリゲート(BeginInvokeで処理を開始させた場合)で関数の戻り値を取得することは可能でしょうか。

※Invokeで処理を走らせた場合、実行関数の戻り値は取得できました。
※関数に戻り値があるがBeginInvokeで指定しても特にエラーはおきませんでした。



以下簡略したコードです。


//-------------------------
// Invoke の場合
//-------------------------

delegate double MyDele(int);

double myfunc(int X)
{

 double dblA;

 dblA = foo();

 return dblA;
}

int main()
{
int a;
MyDele^ dele = gcnew MyDele(&myfunc);

double getAns = dele(a);//BeginInvokeで走らせない場合はInvokeとなるようです
※ 戻り値を確認できました

return 0;
}


//-------------------------
// >BeginInvokeの場合
//-------------------------

delegate double MyDele(int);

double myfunc(int X)
{

 double dblA;

 dblA = foo();

 return dblA;
}

int main()
{
int a;
MyDele^ dele = gcnew MyDele(&myfunc);
IAsyncResult^ result = dele->BeginInvoke(a,nullptr,nullptr);
dele->EndInvoke(result);

※ 戻り値を取得したい・・・・


return 0;
}



myfunc(int X)にポインタ型の引数を増やして、それに戻り値を代入してみたのですが

#myfunc(int X、double^ k)
# k=dblA 


EndInvoke後に呼び出し元のmyfunc(int X、double^ k)
のkの値はnullptrとなってしまいます。



お力添えいただければ幸いです。何卒よろしくお願い申し上げます。



引用返信 編集キー/
■88428 / inTopicNo.2)  Re[1]: C++/CLI delegate 関数の戻り値取得方法につい
□投稿者/ Hongliang (680回)-(2018/08/29(Wed) 21:29:32)
EndInvokeが返値を返します。System::Objectなので適切にキャストして下さい。
でもBeginInvoke直後にEndInvokeしたらまるで意味がないような。

// しかしDelegate::BeginInvokeとかもう何年も見てないや。
// C++/CLIだとDelegateに変換可能なラムダ式は書けないんだったっけ? だとするとTaskも面倒そう。
引用返信 編集キー/
■88429 / inTopicNo.3)  Re[2]: C++/CLI delegate 関数の戻り値取得方法につい
□投稿者/ びぎなー青ドンちゃん (2回)-(2018/08/29(Wed) 22:01:43)
Hongliang 様

早々にご回答頂き誠にありがとうございます。
こんなに早くご回答を頂けるとは思わず
職場を今離れてしまいました。

『EndInvokeが返値を返します』
について明日、早速確認致します。


> でもBeginInvoke直後にEndInvokeしたらまるで意味がないような。

に関しましては
例で上げたコードに不備がございました。
実際のコードではBeginInvoke後に他の処理が入ります。


> // しかしDelegate::BeginInvokeとかもう何年も見てないや。
> // C++/CLIだとDelegateに変換可能なラムダ式は書けないんだったっけ? だとするとTaskも面倒そう。

C++/CLIはレアになってきているということでしょうか。(泣)

勉強不足で申し訳御座いません。
C++/CLIだけでなく開発歴も浅く
『変換可能なラムダ式』というのがわかりません。
そのキーワードについても調べたいと思います。

まずはお礼まで。



引用返信 編集キー/
■88430 / inTopicNo.4)  Re[3]: C++/CLI delegate 関数の戻り値取得方法につい
□投稿者/ Hongliang (681回)-(2018/08/29(Wed) 22:44:19)
> C++/CLIはレアになってきているということでしょうか。(泣)
個人的な感想としては、C++/CLIは登場当初からニッチ用途にしか使われていないように思います。
// C++/CLIの登場当初からと言うより、C++/CLIの前身であるManaged C++からか。

> 勉強不足で申し訳御座いません。
> C++/CLIだけでなく開発歴も浅く
> 『変換可能なラムダ式』というのがわかりません。
> そのキーワードについても調べたいと思います。
ラムダ式というのは、関数内で記述できるローカル関数に近いものです。
最近の言語ではよく採用されており、C#はもちろん、C++でも使えます。
そして関数的なものなので、C#ならdelegateとして、C++なら関数ポインタなどとして扱えます。
C++/CLIでもラムダ式を書けますが、書けるのはネイティブのラムダ式なので、関数ポインタとしては扱えてもdelegateとしては扱えない、という話です。
// 最近のC++/CLIで状況が変わってるかも知れませんが。
// 書いてて思ったけど関数ポインタにはできるんだからMarshal::GetDelegateForFunctionPointerでどうにかならないこともないのか、な? マネージオブジェクトの扱いで結局アレだろうけど。
引用返信 編集キー/
■88432 / inTopicNo.5)  Re[4]: C++/CLI delegate 関数の戻り値取得方法につい
□投稿者/ びぎなー青ドンちゃん (3回)-(2018/08/30(Thu) 09:59:55)
Hongliang 様

ご教示頂きました内容で『EndInvokeが返値を返します』を確認することができました。
本当にありがとうございました。

業務を先に進めることができます。

まだまだ未熟で理解不足ではございますが
お教え頂きました内容について大変勉強になりました。

重ね重ね御礼申し上げます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ