          patch_queue = queue_manager.get_queue("patch")
          self.patch_threads = MultiThread(self.converter.process, patch_queue, save_queue,
                                           thread_count=self.pool_processes, name="patch")
  
          self.patch_threads.start()
          while True:
              self.check_thread_error()
              if self.disk_io.completion_event.is_set():
                  logger.debug("DiskIO completion event set. Joining Pool")
                  break
 
</s> remove             self.check_thread_error()
            if self.disk_io.completion_event.is_set():
 </s> add             self._check_thread_error()
            if self._disk_io.completion_event.is_set(): </s> remove         self.patch_threads = MultiThread(self.converter.process, patch_queue, save_queue,
                                         thread_count=self.pool_processes, name="patch")
 </s> add         self._patch_threads = MultiThread(self._converter.process, patch_queue, save_queue,
                                          thread_count=self._pool_processes, name="patch") </s> remove             if self.patch_threads.completed():
 </s> add             if self._patch_threads.completed(): </s> remove     def convert_images(self):
        """ Convert the images """
 </s> add     def _convert_images(self):
        """ Start the multi-threaded patching process, monitor all threads for errors and join on
        completion. """ </s> remove     def process(self, trigger_event, shutdown_event, patch_queue_in, samples, tk_vars):
        """ Wait for event trigger and run when process when set """
 </s> add     def _process(self, trigger_event, shutdown_event, patch_queue_in, samples, tk_vars):
        """ The face patching process.

        Runs in a thread, and waits for an event to be set. Once triggered, runs a patching
        cycle and sets the :class:`Display` destination images.

        Parameters
        ----------
        trigger_event: :class:`threading.Event`
            Set by parent process when a patching run should be executed
        shutdown_event :class:`threading.Event`
            Set by parent process if a shutdown has been requested
        patch_queue_in: :class:`queue.Queue`
            The input queue for the patching process
        samples: :class:`Samples`
            The Samples for display.
        tk_vars: dict
            Global tkinter variables. `Refresh` and `Busy` :class:`tkinter.BooleanVar`
        """
        self._patch_threads.start()
          patch_queue = queue_manager.get_queue("patch")
          self.patch_threads = MultiThread(self.converter.process, patch_queue, save_queue,
                                           thread_count=self.pool_processes, name="patch")
  
        self._patch_threads.start()
          while True:
              self.check_thread_error()
              if self.disk_io.completion_event.is_set():
                  logger.debug("DiskIO completion event set. Joining Pool")
                  break
keep keep keep keep replace keep keep keep keep keep
 Smart Masks to Convert (#957)

- scripts.convert - Use Smart Masks for Convert
    * Make on-the-fly conversion an explicit option

- Move BlurMask to lib.faces_detect

- tools.preview - Fix for smart masks
    * Subclass from tk.Tk
    * Options to lib.gui.control_helper
    *variable cleanup

- lib.logger - Demote more tensorflow deprecation messages

- Documentation:
    * lib.faces_detect.BlurMask
    * plugins.convert.mask
    * lib.convert
    * scripts.convert
    * scripts.fsmedia
    * tools.preview 
scripts/convert.py