読者です 読者をやめる 読者になる 読者になる

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

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

クッキーツイートの高速化 その14 BackgroundWorkerの全盛りソース #CookieToEat

←全盛りは一般人の限界は超えてない?

ではStatusStripを使ってToolStripProgressBarをつけたBackgroundWorkerのソースを書きます。

ToolStripProgressBarは普段表示させないほうが自然です。

使う直前に表示させましょう。

初期化処理でToolStripProgressBarをクリアして表示させます。

//ボタンを押す
private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    toolStripProgressBar1.Visible = true;
    toolStripProgressBar1.Value = 0;
    backgroundWorker1.RunWorkerAsync();
}


次にキャンセル処理です。先ずWorkerSupportsCancellationをtrueにします。

次にDoWorkのループでbackgroundWorker1.CancellationPendingをチェックします。

キャンセルが呼ばれたら、そこでreturnを返します。

キャンセルを呼ぶにはボタンが押された時にCancelAsync()を呼びます。


キャンセル処理は、押してすぐ反映するわけではありません。

ボタンを押してから実際に処理が来るまでにタイムラグがあります。

以前から説明しているキャンセルボタンにも「Button.Enabled = false;」処理は必須です。

終了時にキャンセルかどうか見るならRunWorkerCompletedでe.Cancelledでチェック出来ます。


コントロールの操作はProgressChangedで行います。

WorkerReportsProgressをtrueにする必要があります。

後はDoWorkでReportProgressを呼びます。これも呼んだらすぐではなく、タイムラグがあるので気をつけてください。

終了処理でToolStripProgressBarを消します。

//処理する
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 10; i++)
    {
        System.Threading.Thread.Sleep(1000);
        //キャンセル処理されたかチェック
        if (backgroundWorker1.CancellationPending)
        {
            e.Cancel = true;
        //処理を中断
            return;
        }
        //進行状況を渡す
        backgroundWorker1.ReportProgress(i);
    }
}
//ボタンが押されたら
private void CancelButton_Click(object sender, EventArgs e)
{
    toolStripProgressBar1.Visible = false;
    CancelButton.Enabled = false;
    //キャンセル処理
    backgroundWorker1.CancelAsync();
}
//進行状況の表示
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    toolStripProgressBar1.Value = e.ProgressPercentage;
}
//終了処理
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    button1.Enabled = true;
    toolStripProgressBar1.Visible = false;
}