電子書籍の厳選無料作品が豊富!

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

A 回答 (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)
{
// ・・・
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/03 21:50

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

    • good
    • 0

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


おすすめ情報