• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#で2つのinvokeが同時に走ると例外発生?)

C#で2つのinvokeが同時に走ると例外発生?

このQ&Aのポイント
  • Visual Studio 2008、言語はVisual C#を使い、カメラで取り込んだ映像から対象物を探すアプリを作成しています。
  • Form_Mainでカメラの映像をリアルタイムに表示し、Form_Resultで画像認識の結果をカメラの映像に書き込み、加工後の映像を表示しています。
  • しかし、Form_Resultで同時にinvokeを起動し結果表示をしようとすると、Argument Exceptionが発生してしまいます。解決方法をご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

的を得ていないかもしれないですが、参考程度で・・・ 2つのフォームから相互にInvokeを実行しているということでしょうか?それだと処理によっては失敗することがあるかもしれません。 たとえばフォームAからフォームBにInvokeで呼び出し、そのデリゲートからさらにフォームAへInvokeを行う・・・などです。 もし実行の完了を待つ必要がないのであれば、Invokeの代わりにBeginInvokeを使ってみてはどうでしょう?

noname#228769
質問者

お礼

回答ありがとうございます。 再度ソースをよく解析した結果、 Invokeとは関係なかったことが判明しました。 お手数おかけして申し訳ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 画像処理したBitmapをピクチャボックスで表示すると、例外が発生して

    画像処理したBitmapをピクチャボックスで表示すると、例外が発生してしまいます。 使用言語はVC#、開発環境はVisual Stdio 200です。 コードは以下の通りです。 class MyClass { Bitmap bmp_result;  public MyClass() { bmp_result = new Bitmap(1024,768,PicelFormat.24bpprgb); } while (true) { ・スクリーンショット画像を撮影し、bmp_resultに格納 ・bmp_resultに対して画像処理  //結果をピクチャボックスに表示。 Invoke(new UpdateDelegate(UpdateUI)); } private void UpdateUI() { pictureBox1.Image = this.bmp_result; } } 実行すると、 bmp_resultに対する画像処理のところで 「オブジェクトは現在他の場所で使用されています。 」 という例外が発生してしまいます。 invokeをコメントアウトすると、例外は発生しなくなります。 よって、UpdateUI関数と、無限ループ内の画像処理とが衝突しているのではないかと 思っているのですが、どう直せば解決するのかわかりません。 どなたかアドバイスをください!

  • C#で例外が発生したとき、例外をthrowした場所を知りたい。

    Visual Studio 2005(C# 2.0 )を使っています。 例外が発生したとき、例外をthrowした場所を知りたいのですが、可能でしょうか。可能であればどうすればよいのでしょうか。

  • invoke内での例外について

    VisualStudio2010でc#を使っています。 invokeで呼び出した関数内でランタイムエラーが発生した場合に、 try~catch句がない場合にはinvokeが書かれている行で プログラムが停止してしまうのですが、 実際に例外が発生した行がわかないので困っています。 例外が発生した行で停止するようにする方法はありませんか? よろしくお願いします。

  • C# 例外が発生しないことの保障

    Javaと比較して書きます。 Javaで記述した場合: public class JavaClass {  public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass {  public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner {  public Exceptionner()  {   throw new ApplicationException("Exceptionnerクラスの例外");  } } public class SampleClass {  public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint {  public static void Main()  {   try   {    SampleClass s = new SampleClass();   }   catch (Exception e)   {    // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。    // つまり、元の例外の情報は失われている    Console.WriteLine(e.GetType());   }  } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)

  • C#でフォームの中にフォームを貼り付けたい

    C#(Visual Studio2005)でフォームの中にフォームを貼り付けたいのですが そういう事は可能でしょうか。 MDIではなく配置したいのです。 (MFCならCWndの中にCWndを作るように) private void Form1_Load(object sender, EventArgs e){ Form2 form2 = new Form2(); form2.parent = this; form2.top = 10; form2.left = 10; form2.Show; } これをやると ※「トップレベルのコントロールは追加できません。」という例外が発生します。 やりたいことは、フォームの中の子ウインドウを状況によってきりかえたいのですが。 宜しくお願い致します。

  • 【C#】別フォームも同時に閉じるには?

    いつもお世話になります。 C#に関して質問です。 VisualC#2008を使っています。 今、Form1の閉じるボタンを押すと、別フォームのForm2も閉じるようにプログラムを組んでいます。 今のところ、下のようなプログラムを書いているのですが、Form1だけが閉じられるだけでForm2が閉じられません。 どうしたらいいのでしょうか? 誰か解決策を教えてください。 よろしくお願いします。 public Form form1; private void Form2_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result; result = MessageBox.Show("このまま終了すると問題は保存されません。よろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2); if (result == DialogResult.OK) { Form form1 = new Form(); form1.Close(); } else if (result == DialogResult.Cancel) { //キャンセル時の処理内容 } }

  • SerialPort処理でInvokeメソッドを使用するとエラーが発生。

    はじめまして。こんばんわ。 同一プロジェクトの複数のフォームから、RS232C接続処理を行っております。 まったく同じ処理内容なので、クラスを使用しようとしております。 しかし、データ受信時、Invokeメソッドを使用して、各フォームのイベントをCALLしますと、『InvalidOperationException』が発生し、『ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。』というエラーメッセージが表示されてしまいます。 ソースを下記に記載いたします。どなたか、原因・対処方法がわかる方がいらっしゃいましたら、御手数をおかけいたしますが、ご教示の程、よろしくお願い申し上げます。 ============================== 呼び出し元フォーム ============================== Public Class Form1   Private cls232CIns As cls232C   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     cls232CIns.openport()   End Sub   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     cls232CIns = New cls232C()   End Sub   Public Sub DispData(ByVal data As String)     TextBox1.Text = data   End Sub End Class ============================== SerialPort通信クラス ============================== Imports System.IO.Ports Public Class cls232C   WithEvents SP1 As SerialPort   Delegate Sub RecvDataDisp(ByVal dataR As String)   Public Sub New()     SP1 = New SerialPort("COM6", 9600)   End Sub   Public Sub openport()     SP1.Open()   End Sub   Public Sub closeport()     SP1.Close()   End Sub   Public Sub ReceiveData(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived     Dim getdata As String     getdata = SP1.ReadLine     Form1.Invoke(New RecvDataDisp(AddressOf Form1.DispData), getdata) ←ここでエラー発生   End Sub End Class  

  • 例外処理のことで

    class ExceptionTest{ static int array[] = {10,20,30,40,50}; void print(){ for(int i=0;i<10;i++) System.out.println(array[i]); } public static void main(String args[]){ new ExceptionTest().print(); } } /* 対処前 10 20 30 40 50 Exception in theread "main"java.ArrayIndexOutOfBoundsException:5 at ExceptionTest.print(ExceptionTest.java:6) at ExceptionTest.main(ExceptionTest.java:10) という実行結果を 対処後 10 20 30 40 50 例外 例外 例外 例外 例外 */ という出力結果を出したいのですがどうしたらいいのですか? また、 /* 10 20 30 40 50 例外が発生しました */ という出力結果も同様にお願いします。

  • 例外OEがVxD CDRBSVSD(01)・・・・で発生しました。

    マイコンピュータ等をクリックした場合、 例外 OE が VxD CDRBSVSD(01)+000007BCの 0028:C166AD6C で発生しました。 VxD VKD(01)+000001D0 の 0028:C007779Cからの呼び出しです。 と、表示され、いずれかのキーを押すと、更に 例外OEが 015F:BFFAADD5 で発生しました。 と表示されます。 そのたびに再起動するのですが。 どうしたものでしょうか? ちなみに 自作機で、 ・マザーボード・・・Aopen AX3S Pro ・CPU・・ ・・・・・Pentium

  • Visual C♯ フォーム間での値の受け渡し

    Visual C♯ フォーム間での値の受け渡しについて プログラミング初心者です。 今、勉強中なのですが、試行錯誤しても出来なかったので助けていただければと思います。 現在Visual C# 2008を使っております。 フォーム間の値の受け渡しについて、助言をお願いします。 [Form1] ・TextBox1 ・Button1 [Form2] ・TextBox2 ・Button2 1.Form1のButton1をクリックし、Form2を出す。 2.Form2のtextBox2に文字を入力し、Button2をクリックする。 3.Form1のTextBox1に、Form2のtextBox2に入力した文字を表示する。 という、作業をしたいのです。 できればソース付きで教えていただけると助かります。 よろしくお願いします。