あるソースをもとに別のアプリを作成しているのですが、コードサイズが小さいとソフトの動作が早くなり、そのため、ベースとしたアプリでは発生しないことがたまに起こります。
多くがスレッド間の衝突です。
nSelectedLength = txtNCProgram.SelectionLength;
上記のコードですが、txtNCProgramはコントロール(リッチテキスト)ですが、この中身を変更直後「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'txtNCProgram' がアクセスされました。」で落ちます。
いうまでもなく、txtNCProgram.SelectionLengthの部分をinvoke/requireを利用した関数に置き換えれば解決しそうですが、returnがある場合の記述方法がわからず困っております。
returnのある場合のinvoke/requireはどう記述するのかご教授願いします。
> returnがある場合の記述方法がわからず困っております。
「return がある場合」と言うのがどういう状況、要望なのかどうも良く分からない気がします。
nSelectedLength = txtNCProgram.SelectionLength;
を実行しているのが別のスレッドで、そのスレッドとはまた別のスレッドがnSelectedLengthを取り出すにはどうしたらよいのか。あるいはそれを
デリゲート(delegate ※)を使って実装したい場合はどのようにコーディングしたら良いのか、と言うご質問でしょうか。
※
誤:デリゲード
正:デリゲート(delegate)
です。
別のスレッドで
txtNCProgram.Text = stProg ;
これが完了しないうちに、"nSelectedLength = txtNCProgram.SelectionLength;"が実行されている状態のため、落ちているのだと思います。
「txtNCProgram.SelectionLength」をデリゲートで処理するように変えたいのですが、どう記述すればよいかといつ質問です。
async - await とか Task.Wait() は使ってないのですか?
もし、ホントに上記が原因で、async - await とか Task.Wait() は使ってないなら、試しに使ってみてはいかがですか?
> async - await とか Task.Wait() は使ってないのですか?
使っていませんね。
> 試しに使ってみてはいかがですか?
さっき気が付いたのですが、やるのであれば、「nSelectedLength = txtNCProgram.SelectionLength;」1行そっくりデリゲートする方が近道です。
あなたの言う「1行そっくりデリゲート」とはどういう意味ですか。
どう考えても見当違いのような気がするのですが。違ったら失礼しました。
回答1件
あなたの回答
tips
プレビュー