Ruby 线程学习:观察线程池完成情况

时间:2020-12-29 21:50:08

标签: ruby multithreading threadpool gtk3 watch

我将继续在 Ruby 中学习 gtk 和线程编程。我想知道以下情况下普遍接受的策略是什么:

我设置了几个类:JobList 和 Job

  • 每个职位列表都有多个职位
  • 每个作业都会跟踪自己的完成百分比
  • 每个作业列表跟踪完成的作业数量,并有一个完整的? 方法
  • 每个工作列表也有一个方法来总结工作的百分比 完整性(用于进度条)

我创建了一批作业列表,每个都有自己的progress_bar,然后单击一个按钮来循环遍历每个作业列表并启动它的 process_all_jobs 方法,该方法依次将每个作业转储到一个公共的 ruby​​ 并发线程池中。每个列表都会更新其分配的进度条。所有这些工作正常,但我想禁用执行按钮的敏感属性,直到一切都完成。完成后,我想将其重置回敏感状态并将标签更新为“完成”,因此我需要知道线程池何时完成处理所有作业。

我写了一个小的“观察者”例程并将它转储到它自己的线程中,它在哪里查看完整? while 循环中所有作业列表的方法,并在退出时重置按钮和标签。感觉这不是执行此操作的正确方法。处理这个问题的普遍接受的策略是什么?我是在尝试编写自己的事件吗?如果是这样,我会将我的学习路径扩展到学习如何编写好的事件...

这是在将所有东西倾倒到池中后跑的“观察者”。

b = []
lists.size.times { b << false }
_thr = Thread.new do
# Loop that continues to update the progress bars until all lists' progress completion statuses are true
while b.include?(false)
  lists.each do |list|
    b[list.id] = list.complete?
    @rows[list.id].progress_bar.fraction = list.fraction_complete
    sleep(0.01)
  end
end
# Processing complete so set status label and button states again
label_synced.text = 'Synced'
btn_new.sensitive = true```

0 个答案:

没有答案