プロが教える店舗&オフィスのセキュリティ対策術

WindowsXP、VC++ 2005 ExpressEditionを使用しています。
2台のパソコンをケーブルで繋いでチャットシステムを作ろうとしているのですが、
「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール '(コントロール名)' がアクセスされました。」
というエラーが出てしまいます。

ハイパーターミナルを使ってデータの送受信を確認した所、データの送信、受信共に出来ています。
問題はコントロールにアクセスできないところだと分かってはいるのですが、具体的にどのような書き方をしてデータを渡せばいいのか分かりません。
デリゲートではないかと見当をつけて、C#なら見つけたものの、それをどうVC++の書き方にすればいいか分からないので困っています。
また、デリゲートを使えばいいのかさえ手探り状態なので、どなたかご教授ください。

A 回答 (2件)

.NETでは、メインスレッド以外がフォームやコントロールのプロパティを変更することを禁止しています。


>デリゲートではないかと見当をつけて
その見解であっているはずです。

参考サイトにC++でのソースがあります。

参考URL:http://msdn2.microsoft.com/ja-jp/library/a06c0dc …
    • good
    • 0
この回答へのお礼

ありがとうございます。
C++のソースを元に改造を加えてみた所、目的のコントロールに表示できるようになりました。

しかし動いたものの、疑問なところがあります。

void DelegateMethod( TextBox^ myControl, String^ myCaption )
{
myControl->Name = "Print_txt";
Print_txt->Text = myCaption;
}
この部分の表記で、新しく定義したmyControlというテキストボックスの名前を、表示したいコントロール名(元からフォームに配置してあったもの)に変えて、そこにmyCaptionの中身を表示するようにしたのですが、元からあった同名のテキストボックスとの関係はどうなっているのでしょう。
アクセスできるように名前を指定するのでしょうか?

参考サイトのソースは新しくコントロールを追加していたため、元からあるコントロールに表示したい場合にこの書き方でなぜ表示されるのか、納得できないので教えていただけると幸いです。

お礼日時:2007/02/02 14:44

#1です。



いまいち「新しく定義したコントロール」「定義済みコントロール」をどう渡したのか、文面から読みづらいのですが。
貴方が何を理解していて、何を理解していないのか正直わかりません。以下、想像というかあてずっぽうで回答します。


ローカルとグローバルのスコープの違いだとか、引数はローカルだとか、その違いを理解されていますか?
DelegateMethodの引数「myControl」「myCaption」はローカルの宣言なので、存在しない全然別の名前「ctrl」「cap」に変えても動作は変わりません。
#変わったら何か別の間違いをしている。

あと、myControlという名前がすでに別のところで使われていても、直近で宣言したローカル変数に同名の名前があればそちらが優先されます。
それで混乱しているのでは?
    • good
    • 0
この回答へのお礼

>あと、myControlという名前がすでに別のところで使われていても、直近で宣言したローカル変数に同名の名前があればそちらが優先されます。

聞きたかったことはこれです。
つたない文章に回答していただきありがとうございました。

お礼日時:2007/02/08 09:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!