循环时如何显示消息框或加载框?(代码可能被阻止,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、计时器、秒表。。。全部采用主螺纹或侧螺纹。。

提前感谢!!

循环时如何显示消息框或加载框?(代码可能被阻止,25秒后继续)

您需要在一个单独的线程上完成工作。异步编程研究

或者您可以简单地使用多线程。我建议使用异步编程来完成后台工作和更新GUI的文本框控件。

您应该使用后台工作者。有一个专用的报告进度事件,可用于更新您需要的加载框。

后台工人类和示例