循环时如何显示消息框或加载框?(代码可能被阻止,25秒后继续)
本文关键字:继续 25秒 代码 加载 何显示 显示 循环 消息 | 更新日期: 2023-09-27 18:26:50
我已经有了这个,但它不起作用。。。我需要检查plc的一个位是否高。如果它仍然很高,我需要等待5秒钟,然后再次检查。。现在我正试图找到一些东西,以便为用户提供一些视觉反馈。我想在一个文本框中输入"正在等待…"而等待后的点数每5秒增加一次。我尝试了很多方法,但似乎都没能奏效。大多数情况下,它只挂起25秒而不更新GUI,然后继续…:/
// First check if the plc bit, that says if there is still an order active,
// is still set. If so then we wait a couple seconds.
var bitorder = Main.PIOGetValue(jbmis.IO_GET_INPUT, "BoxManInStarted");
int counter = 1;
string loadingpoints = "";
loadtimer.Tick += timer_Tick;
loadtimer.Interval = (int)TimeSpan.FromSeconds(5).TotalMilliseconds;
loadtimer.Start();
loadtimer.Enabled = true;
// Stopwatch sw = new Stopwatch();
while(bitorder != 0 && loadtimercounter != 25)
{
// TODO multithreaded
#region testcode
// MessageBox.Show("Waiting for previous order to be stopped" + loadingpoints);
// Context.UserMessageService
// .ShowMessage("Waiting for previous order to be stopped" +
// loadingpoints, "Waitingfororder");
// sw.Start();
// while (sw.Elapsed < TimeSpan.FromSeconds(25))
// {
// if (sw.Elapsed.Seconds % 5 == 0)
// {
// loadingpoints = loadingpoints + ".";
// tbScannedEANPick.Background = Brushes.OrangeRed;
// tbScannedEANPick.Text = "Waiting" + loadingpoints;
// }
// }
// sw.Stop();
// loadingpoints = loadingpoints + ".";
// tbScannedEANPick.Background = Brushes.OrangeRed;
// tbScannedEANPick.Text = "Waiting" + loadingpoints;
// tbScannedEANPick.UpdateLayout();
#endregion
if (loadtimercounter % 5 == 0)
{
loadingpoints = loadingpoints + ".";
tbScannedEANPick.Background = Brushes.OrangeRed;
tbScannedEANPick.Text = "Waiting" + loadingpoints;
tbScannedEANPick.IsReadOnly = true;
bitorder = Main.PIOGetValue(jbmis.IO_GET_INPUT, "BoxManInStarted");
}
counter ++;
}
// After 25 seconds stop timer and continue
loadtimer.Stop();
void timer_Tick(object sender, EventArgs e)
{
loadtimercounter += 5;
}
我在找半天。。。我试着使用Thread.sleep、计时器、秒表。。。全部采用主螺纹或侧螺纹。。
提前感谢!!
您需要在一个单独的线程上完成工作。异步编程研究
或者您可以简单地使用多线程。我建议使用异步编程来完成后台工作和更新GUI的文本框控件。
您应该使用后台工作者。有一个专用的报告进度事件,可用于更新您需要的加载框。
后台工人类和示例