我将继续在 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```