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

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

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

Re[4]: C++/CLIでのdelegateの使い方


(過去ログ 133 を表示中)

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

■78297 / inTopicNo.1)  C++/CLIでのdelegateの使い方
  
□投稿者/ 綾瀬さとみ (8回)-(2016/01/06(Wed) 19:06:02)

分類:[C++/CLI] 

C++/CLIでTheredからコントロールを操作したく下記の文献を参考に
http://wisdom.sakura.ne.jp/programming/cs/cs54.html
https://msdn.microsoft.com/ja-jp/library/c320cx3h.aspx?f=255&MSPPError=-2147217396

このように書きました。

delegate void del();
dlmain^ d1;

private: System::Void Button1_Click(System::Object^ sender, System::EventArgs^ e) {
d1 = gcnew del(this, &MyForm::n);
Thread^ th = gcnew Thread(gcnew ThreadStart(this, &MyForm::m));
th->Start();
}

void m()
{
d1();
}
void n()
{
label1->Text = "あ";
}

するとこの様なエラーがでました。
型 'System.InvalidOperationException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました

追加情報: 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'label1' がアクセスされました。


よろしくおねがいいたします。
引用返信 編集キー/
■78298 / inTopicNo.2)  Re[1]: C++/CLIでのdelegateの使い方
□投稿者/ 綾瀬さとみ (9回)-(2016/01/06(Wed) 19:10:07)
追記です。
以下のような警告もでます。
warning C4677: 'd1': 公開されたメンバーのシグネチャはアセンブリ プライベート型 'test::MyForm::del' を含んでいます。
引用返信 編集キー/
■78302 / inTopicNo.3)  Re[2]: C++/CLIでのdelegateの使い方
□投稿者/ Azulean (570回)-(2016/01/06(Wed) 22:12:10)
Invoke とか、InvokeRequired とか調べてみてください。
引用返信 編集キー/
■78304 / inTopicNo.4)  Re[3]: C++/CLIでのdelegateの使い方
□投稿者/ 774RR (359回)-(2016/01/07(Thu) 06:54:02)
.NET の UI 部品(端的にはコントロール)は、それを new したスレッド上でしか操作を受け付けない仕様。
んでデザイナでコントロールを配置してると、それらは UI スレッド上で new される。
やりたい label1->Text = "あ"; は作業用スレッドの中からではできない(禁止されている)。

というわけで Invoke という機能で UI スレッドに処理を委譲する必要がある。

なんだけど・・・今時 C++/CLI で GUI ソフト書くのは Microsoft 自体が推奨していない。
せっかく習熟しても先細りなので C# に移行することを推奨する。

引用返信 編集キー/
■78305 / inTopicNo.5)  Re[3]: C++/CLIでのdelegateの使い方
□投稿者/ 綾瀬さとみ (10回)-(2016/01/07(Thu) 07:05:30)
2016/01/07(Thu) 07:10:56 編集(投稿者)

ご返信ありがとうございます。
delegate void del();
Invoke(gcnew del(this, &MyForm::n));
void n()
{
label1->Text = "あ";
}

このようにしたらうまくいきました。
ありがとうございます。

ただ、C#だとこのようにメソッドにしなくてもいいのですが
Invoke(new del(delegate
{
label1.Text = "あ";
}));

C++/CLIだとメソッドにするしかないのでしょうか?
引用返信 編集キー/
■78307 / inTopicNo.6)  Re[4]: C++/CLIでのdelegateの使い方
□投稿者/ Hongliang (390回)-(2016/01/07(Thu) 08:57:08)
> C++/CLIだとメソッドにするしかないのでしょうか?
はい。
みんなが口を揃えてC++/CLIはやめてC#にしておけと言う所以の一つです。
(ラムダ式に限った話ではなく新技術全般)
引用返信 編集キー/
■78317 / inTopicNo.7)  Re[4]: C++/CLIでのdelegateの使い方
□投稿者/ 綾瀬さとみ (11回)-(2016/01/07(Thu) 17:09:03)
ご返信ありがとうございます。
助かります。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -