Start the component's event loop (thread-safe).

        After the event loop is started the Qt thread calls the
        component's :py:meth:`~Component.start_event` method, then calls
        its :py:meth:`~Component.new_frame_event` and
        :py:meth:`~Component.new_config_event` methods as required until
        :py:meth:`~Component.stop` is called. Finally the component's
        :py:meth:`~Component.stop_event` method is called before the
        event loop terminates.

def start(self):
        """Start the component's event loop (thread-safe).

        After the event loop is started the Qt thread calls the
        component's :py:meth:`~Component.start_event` method, then calls
        its :py:meth:`~Component.new_frame_event` and
        :py:meth:`~Component.new_config_event` methods as required until
        :py:meth:`~Component.stop` is called. Finally the component's
        :py:meth:`~Component.stop_event` method is called before the
        event loop terminates.

        """
        if self._running:
            raise RuntimeError('Component {} is already running'.format(
                self._owner.__class__.__name__))
        self._running = True
        self.queue_command(self._owner.start_event)
        # process any events that arrived before we started
        while self._incoming:
            self.queue_command(self._incoming.popleft())