0

在我的项目中,我有主要形式。在那个主窗体上,我在运行时调用用户控件。像这样运行的事件顺序。

  1. 扫描条形码 - 对此代码进行一些处理

  2. 询问用户“您要扫描更多内容吗?” 然后显示“YES/NO”选项。这不是弹出窗口,我必须在我的触摸屏计算机中为 Kiosk 更新屏幕上的消息。

  3. 等待用户输入一段时间。

  4. 如果用户点击“是”然后接受其他条形码。

  5. 如果用户单击“否”,则进行进一步处理。

  6. 如果用户没有及时回复,则按照“否”回复进行进一步处理。

问题:

  1. 如何在线程之间显示按钮?

  2. 如果用户回复,如何处理按钮单击事件。

    void ShowMoreVoucherOption(bool showhide)
    {
        if (this.btnYes.InvokeRequired)
        {
            this.BeginInvoke((MethodInvoker)(() => btnYes.Visible = showhide));
            this.BeginInvoke((MethodInvoker)(() => btnNo.Visible = showhide));
        }
        else
        {
            btnYes.Visible = true;
            btnNo.Visible = true;
        }
        Application.DoEvents();
    }
    

我在如下线程之间调用这个例程。这不是 UI 线程。

UpdateProgessLabel("Would you like to add more vouchers?");
ShowMoreVoucherOption(true);
Thread.Sleep(15000);
Dofuthrerporcessing(); // in case user does not give input

现在,等待 15 秒,如果用户输入,则继续按钮单击事件,如果没有,则继续此处。

我不确定 Thread.sleep 是否适合这里。还是我必须使用 ManualResetEvent 和 waitone?以及如何处理那里的按钮点击?

4

2 回答 2

0

如果您完全不知道您是否在 UI 线程中(这似乎是这个问题的重点),那么您应该创建一个后台线程来为您完成这项工作。最简单的事情是执行以下操作:

if(SomeKindOfAFormOrAControl.InvokeRequired) // You are not in the UI Thread
{
  Thread.Sleep(15000);
  UpdateProgessLable("Your message.");
}
else // You are in the UI Thread
{
  ThreadPool.QueueUserWorkItem(delegate {  // Spawn a Background Thread
    Thread.Sleep(15000);
    UpdateProgessLable("Your message.");
  });      
}
//Your UI thread will keep running from this point if
//SomeKindOfAFormOrAControl.InvokeRequired was false.

这是你想要的?

编辑:

在 UI 线程中,您不必调用 Invoke,您可以从那里操作 UI;事实上,当您不在 UI 线程中时,您必须调用 Invoke。所以:

如果是 UI 线程需要在 15 秒后隐藏按钮,则必须像我在上面的代码中那样在后台线程中运行它:

ThreadPool.QueueUserWorkItem(delegate {  // Spawn a Background Thread
    Thread.Sleep(15000);
    ShowMoreVoucherOption(true);
  }); 

如果它不是 UI 线程,那么这段代码就足够了:

Thread.Sleep(15000);
UpdateProgessLable("Your message.");

我猜您没有足够的关于涉及 UI 的多线程的信息。要么了解更多信息,要么尝试这些解决方案,希望你很幸运。

于 2013-02-05T19:59:44.730 回答
0

Thread.Sleep,哈?查看您的规格(不是代码),我不会这样。扫描条形码并启动计时器。每次用户及时单击“是”时重置计时器。如果用户错过了机会,请停止接受用户输入并处理已扫描的内容。您将需要某种形式的锁定以防止同时处理用户输入和计时器,并且您将摆脱不必要的 Tread.Sleep。

于 2013-02-05T21:53:44.400 回答