none
Windowsのマルチスレッドについて質問 RRS feed

  • 質問

  • お世話になっています。

    .NET3.5で開発をしていますが、Windowsのマルチスレッドについて疑問があります。

    現在私が作成しているアプリケーションでFormから重たい処理をBeginInvokeを使って呼び出しています。

    BeginInvokeを使えば新しいスレッドが作成され、Formと重たい処理は別スレッドで実行されるという認識です。

    そのようにスレッドを分けて処理を行ったとしても、裏で行っている重たい処理の為にFormの動作がカクカクになります。

    その間、他のアプリケーション(ブラウザやExcel)は正常に動いています。

    CPUには全然余裕があって、自分の作成したプロセスのみカクカクな状態です。

    別プロセスがすんなり動くのであれば、Formのカクカクも改善出来そうな気がするのですが、考えられる原因などありますでしょうか?

    それとも、スレッドが別ということと、プロセスが別というのは全く別なのでしょうか?

    2012年10月19日 13:19

回答

  • BeginInvokeとはControl.BeginInvoke()のことでしょうか。であれば新しいスレッドは作られておらず、FromのUIスレッド上で後で実行されるだけです。当然ながら、重い処理がUIスレッド上で動作していればカクカクになるのも当然です。
    そうではなく同期メソッドの非同期呼び出しのBeginInvoke()であれば新しいスレッドが作られます(正確にはスレッドプールですが)。カクカクになるのには何か別の原因があるかと思います。
    同名なため、メソッド名だけではどちらを使われているのかはこちらにはわかりません。

    FormのUIスレッドとBeginInvokeで呼び出された中とでThread.ManagedThreadIdプロパティで同一スレッドかどうか確認してみてください。

    • 回答としてマーク BB-X LARISSA 2012年10月22日 13:30
    2012年10月19日 13:47

すべての返信

  • BeginInvokeとはControl.BeginInvoke()のことでしょうか。であれば新しいスレッドは作られておらず、FromのUIスレッド上で後で実行されるだけです。当然ながら、重い処理がUIスレッド上で動作していればカクカクになるのも当然です。
    そうではなく同期メソッドの非同期呼び出しのBeginInvoke()であれば新しいスレッドが作られます(正確にはスレッドプールですが)。カクカクになるのには何か別の原因があるかと思います。
    同名なため、メソッド名だけではどちらを使われているのかはこちらにはわかりません。

    FormのUIスレッドとBeginInvokeで呼び出された中とでThread.ManagedThreadIdプロパティで同一スレッドかどうか確認してみてください。

    • 回答としてマーク BB-X LARISSA 2012年10月22日 13:30
    2012年10月19日 13:47
  • 佐祐理さん

    回答ありがとうございます

    使っているのはControl.BeginInvoke()です、スレッドが別になると思っていたのですが

    ご指摘頂いたとおり、ManagedThreadIdを使ったところ同じIdでした。。

    これからご紹介頂いた方法を試してみます


    2012年10月22日 13:12