血圧アプリその6
処理中ダイアログが固まることが判明・・・
表示完了前にコントロールに触るとなるみたいなので、InvokeRequiredでチェックするようにした。
Excelがエラー吐く件も、EnableEvents=falseにして処理書くことで解決。(o^-‘)b
[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を渡して、ダイアログのスレッド側で処理もさせるのがスマートかもなぁ。
動いてるからこれでいいか・・・