【问题标题】:Generate a 'Busy' or 'Working' dialogue box while a loop runs在循环运行时生成“忙碌”或“工作”对话框
【发布时间】:2015-01-07 08:35:21
【问题描述】:

我正在使用 MSVS2010,但无法创建状态栏或状态条。我有一个循环来做一些事情并运行一些功能。这是一个“while”循环。我需要做的就是在这个循环中显示某种形式,上面写着“忙……”或“工作……”。有没有人有具体的分步说明如何做到这一点?我已经查看了在线教程和示例,但我并不清楚如何实现这一点。对此的任何帮助都会很棒。提前致谢。

【问题讨论】:

  • 到目前为止你做了什么?
  • 在 BackgroundWorker 中运行循环。
  • 到目前为止,我已经创建了一个表单,显示了我所在的当前元素以及循环中的元素总数。所以表单会显示类似....“初始化 3 中的 1”。它会增加。数量如此之少,您几乎看不到表单弹出窗口,因为一旦退出循环,我就会关闭它。计数和我试图捕获的这个“ArcMap 刷新事件”存在一些问题。因此,我不需要使用计数,而是需要一个简单的框来显示它正在运行时显示工作。

标签: c# visual-studio-2010 statusbar


【解决方案1】:

您可以为它使用标签。 只需添加一个标签并将其命名为例如stateLabel

然后在你的代码中做这样的事情:

stateLabel.text = "Working..."; //Change the text of the Label
while(statement = true) //Your Loop
{
    //Do your work
}
stateLabel.text = "Finished work";

【讨论】:

    【解决方案2】:

    简单的方法是使用带有 'marquee' 样式属性的进度条,让用户等待某些东西。 所以在循环之前设置'marquee'属性,然后你可以在循环结束后恢复默认值和/或隐藏这个进度条。 我足够清楚还是你想要一些代码示例?

    【讨论】:

      【解决方案3】:

      你可以做一些简单的事情,比如改变你的光标:

      //change cursor to wait cursors
      this.ForceCursor = Cursors.Wait;
      
      //do loop
      while(true)
      {//do work}
      
      //change the cursor back to regular arrow when work is completed
      this.ForceCursor = Cursors.Arrow;
      

      或者,只要您不在 while 循环中对 UI 控件执行任何操作,您就可以在另一个线程上执行循环。只需在窗口的某处放置一个进度条(称为 myProgBar),如果您不知道循环需要多长时间,则使其不确定。以下是我的做法:

      //create instance of loading window
      YourLoadWindow loadWin = new YourLoadWindow();
      
      //Create a thread that will do our loop work.
      Thread t = new Thread(new ThreadStart(() => 
      {
      //do our looping;
      while (true) {//do work}
      
      //when loop is done, we want to hide the loading window
      //but we created it on a different thread, so we must use its dispatcher to do
      //the work from this thread
      loadWin.Dispatcher.Invoke(new Action(() => { loadWin.Close(); }));
      
      }));
      
      //show load window
      loadWin.Show();
      
      //start doing our work
      t.Start();
      

      【讨论】:

      • 是的,我不打算对循环内的 UI 控件做任何事情。我创建了一个小表格,上面写着“正在工作......”。它在循环之前弹出,在循环结束时关闭。工具箱中有一个progressBar工具。我如何在循环运行时更新此进度条>?
      • 问题是如果你在 UI 线程上做一个循环,它必须等到你的循环完成后才能对 UI 做任何事情。这包括更新进度条。这就是为什么您必须在不同的线程上执行循环,以便 UI 线程可以处理更新进度条等内容。多线程可能会给你最好的性能。因此,在我的示例中,将 myProgBar 替换为具有进度条的窗口。
      猜你喜欢
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多