【问题标题】:Multithreaded update of multiple ProgressBars多个 ProgressBar 的多线程更新
【发布时间】:2012-09-08 01:52:13
【问题描述】:

我开发了一个可以处理数据的应用程序(在我的例子中,图像算法在视频上执行)。我开发了不同的ProcessingMethods。

有时会并行处理多个视频。每个进程在单独的线程中运行。

我有一个带有多个ProgressBars 的 GUI,一个用于处理数据的每个线程。

更新ProgressBar的好方法是什么?

目前,我的 GUI 正在创建所有处理线程,并为每个线程创建一个 ProgressBar。然后我将那些ProgressBars 传递给线程,线程将它们传递给ProcessingMethod。然后ProcessingMethod 将更新ProgressBar(使用Invoke())。

我有不同的ProcessingMethods。在每种方法中,我都有复制粘贴代码来更新ProgressBar。虽然我是编程新手,但我知道复制粘贴不好。

有什么好办法让它变得更好?

【问题讨论】:

  • 请给我们代码,我相信为你重构它会不到一分钟的时间

标签: c# multithreading user-interface progress-bar invoke


【解决方案1】:

创建一个名为UpdateProgressBar 的方法,该方法将使用进度条及其值作为参数,并使用Invoke 包装更新。您将通过调用具有不同参数的单个函数来替换复制粘贴。

【讨论】:

  • 顺便说一句,刚接触编程的人应该尽量远离多线程代码。如果没有牢牢掌握基本技术,我无法想象试图弄清楚比赛条件。
  • 鉴于您需要在 UI 线程中更新进度条(只有一个),这将消除大多数竞争条件。
  • 这将消除进度条竞争条件,而不是视频处理竞争条件......
  • 从问题看来,他们正在处理完全不同的数据集并且根本没有交互,尽管我承认这并不意味着无论如何都没有竞争条件。跨度>
  • ...当然BeginInvoke 在这里会更明智,以便工作线程可以在 UI 线程更新控件时继续处理。
【解决方案2】:

查看 BackGroundWorker 组件。它旨在从 GUI 运行线程,并带有进度指示的安全回调。

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2013-11-12
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多