血圧アプリその6

処理中ダイアログが固まることが判明・・・

表示完了前にコントロールに触るとなるみたいなので、InvokeRequiredでチェックするようにした。

Excelがエラー吐く件も、EnableEvents=falseにして処理書くことで解決。(o^-‘)b

bloodappli040

[csharp]
// 処理中ダイアログ
WaitDialog waitDialog = new WaitDialog();
bool doWork = true;

// プログレスバーStat表示Action
System.Action dialogText = new System.Action((x) =>
{
if (waitDialog.InvokeRequired)
{
waitDialog.Invoke(new System.Windows.Forms.MethodInvoker(() =>
{
waitDialog.Stat = x;
}));
}
});

// プログレスバーMax設定Action
System.Action dialogMax = new System.Action((x) =>
{
if (waitDialog.InvokeRequired)
{
waitDialog.Invoke(new System.Windows.Forms.MethodInvoker(() =>
{
waitDialog.Max = x;
}));
}
});

// プログレスバーValue設定Action
System.Action dialogValue = new System.Action((x) =>
{
if (waitDialog.InvokeRequired)
{
waitDialog.Invoke(new System.Windows.Forms.MethodInvoker(() =>
{
waitDialog.Value += x;
}));
}
});

// ダイアログクローズAction
System.Action dialogClose = new System.Action(() =>
{
if (waitDialog.InvokeRequired)
{
waitDialog.Invoke(new System.Windows.Forms.MethodInvoker(() =>
{
waitDialog.Close();
}));
}
});

// ダイアログ表示
new Thread(new ThreadStart(() =>
{
if (waitDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK)
doWork = false;
})).Start();

// プログレスバー最大値
dialogMax(data.Count);

// プログレスバーStat表示
dialogText("データ設定");

foreach(var day in data)
{
// プログレスバー更新
dialogValue(1);

// 処理中ダイアログが閉じられたら処理中断
if (!doWork)
break;

:
:
:

}

// ダイアログクローズ
dialogClose();
[/csharp]

メインルーチンからダイアログに値設定するのではなく、Actionを渡して、ダイアログのスレッド側で処理もさせるのがスマートかもなぁ。

動いてるからこれでいいか・・・

コメントを残す

%d人のブロガーが「いいね」をつけました。