• ベストアンサー

C#での自作DLL(C言語)の並列化

C言語で自作したDLLをC#で使いたいと考えております。 このDLLの計算量は多くて、値を返すまでに時間がかかります。 そのためにC#のフォームが応答なしになってしまうので並列化したいと思ったのですがうまくいきませんでした。 このDLLは ・int型の戻り値 ・6個の引数 ・上の引数のうち、1つはoutキーワード(ポインタ渡し) です。 どのようにすれば、うまく並列化できるでしょうか。 ご教授お願いいたします。

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

  • ベストアンサー
noname#251971
noname#251971
回答No.2

やりたいことが C言語側の関数を分割・並列処理化しての処理時間短縮なのか、 単にC#側でUIをブロックしないように時間の掛かる処理を非同期に実行したいのか、 が、いまいち読み取れませんでした。 おそらく後者であろうと想定して、 C言語の関数が特に処理の途中中断などをサポートしていないと想定して、 C#はv3.0以降(VisualStudio2008以降)であると想定して、 C#側のGUIはWindows Formsであると想定して、 以下に2例ほど、時間の掛かる処理を非同期に実行する例を記載します。 いずれも、longTimeOperation()の呼び出し部分が時間の掛かる処理を呼び出す部分です。 また、あくまで例なので、処理中のGUIの設定や表示などもあわせて、 適当に読み替えてください。 ■スレッドプールのスレッドを利用した例 private void button1_Click(object sender, EventArgs e) { // フォームクローズを拒否するデリゲート。 FormClosingEventHandler closeGuard = (s, a) => a.Cancel = true; // 別スレッドでの処理が終わるまでの状態設定など。以下は一例。 this.button1.Enabled = false; this.FormClosing += closeGuard; var calcResult = 0; var dataArea = new byte[1024]; ThreadPool.QueueUserWorkItem(_ => { // ここで時間の掛かる処理を呼ぶ calcResult = longTimeOperation(out dataArea); // 処理中の状態を戻すための処理をメイン側に委譲 this.BeginInvoke(new MethodInvoker(() => { this.FormClosing -= closeGuard; this.button1.Enabled = true; // 必要なら後処理など if (calcResult != 0) { // ・・・ } })); }); } ■BackgroundWorkerを利用した例   private void button2_Click(object sender, EventArgs e) { var calcResult = 0; var dataArea = new byte[1024]; // 「WaitingForm」は、処理完了待ち中に表示する自作の適当なフォーム。 // PictureBoxにアニメーションGIFでも載せておくなどすれば良いかも。 using (var bgWorker = new BackgroundWorker()) using (var waitingForm = new WaitingForm()) { bgWorker.WorkerReportsProgress = false; bgWorker.WorkerSupportsCancellation = false; bgWorker.RunWorkerCompleted += (s, a) => waitingForm.Close(); bgWorker.DoWork += (s, a) => { // ここで時間の掛かる処理を呼ぶ calcResult = longTimeOperation(out dataArea); }; waitingForm.Load += (s, a) => bgWorker.RunWorkerAsync(); waitingForm.FormClosing += (s, a) => a.Cancel = bgWorker.IsBusy; waitingForm.ShowDialog(); } // 必要なら後処理など if (calcResult != 0) { // ・・・ } }

lbafm9876a
質問者

お礼

大変申し訳ありません。 書いていただいた通りのことがやりたかったのです。 そしておかげ様で実装することができました。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

並列化したいんだったら, とりあえずループを見付けてみたらどうかな.

関連するQ&A