class_docstr: Tracks pipeline progress and estimates time to completion 
code: def __init__(self, parent, update_callback, multiprocessing=False):
      self.update_callback = update_callback
      # start tracking progress
      self.start_time = time.time()
      self.end_times = None
      self.current_module_name = ""
      self.pause_start_time = None
      self.previous_pauses_duration = 0.0
      self.image_set_index = 0
      self.num_image_sets = 1
  
      # for multiprocessing computation
      self.num_jobs = 1
      self.num_received = 0
  
      self.multiprocessing = multiprocessing
  
      timer_id = wx.NewId()
      self.timer = wx.Timer(parent, timer_id)
      self.timer.Start(500)
      if not multiprocessing:
          parent.Bind(wx.EVT_TIMER, self.update, id=timer_id)
          self.update()
      else:
          parent.Bind(
              wx.EVT_TIMER, self.update_multiprocessing, id=timer_id
          )
          self.update_multiprocessing()
  
file_path: CellProfiler/src/frontend/cellprofiler/gui/preferences_view/_progress_watcher.py
imports: import time
  import numpy
  import wx
label_desc: Use image node_id 1 to create a new ProgressWatcher object  with example: obj = ProgressWatcher(parent, update_callback, multiprocessing)