森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

クッキーツイートの高速化 その12 BackgroundWorkerの進行状況の渡し方 #CookieToEat

←渡すタイミングは、間違えると惨事になります

BackgroundWorkerのDoWorkイベントについて注意点です。

DoWorkイベントは別スレッドで実行されます。

別スレッドの場合、それ以外のところで作成したオブジェクトには、アクセスすることができません。

もっと簡単に言うとDoWork内で以下のプログラムを書くだけでストップします。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    //↓この処理で止まる
    button1.Enabled = false;
}


別スレッドの場合、コンポーネント(フォームを含む)に書き込み禁止です。

とりあえずは、これだけ覚えておけば良いと思います。

厳密には、マルチスレッドはもっと色々テクニックがあります。

ここでは取り上げませんが、きっちり使いたいなら調べてみましょう。


但し、進行状況はコンポーネントに書きこむ以外表現出来ません。

それでは、進行状況を書きたいときにはどうすれば良いでしょう。

その答えが、ReportProgressメソッドとProgressChangedイベントです。

この2つを使えば進行状況を表せます。


DoWorkイベントの中でReportProgressを呼べばProgressChangedイベントが呼ばれます。

ReportProgressは、ProgressChangedに1つだけ引数を渡す事も出来ます。

数をカウントダウンさせたり、プログレスバーに数を渡したり、してみましょう。

ループの回数を渡してその数を表示すれば、それが進行状況になります。