mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
Documentation: Update the "Start an event loop" section
Event loop was moved to be a part of CameraManager, so it is no longer a user responsibility to control the event dispatching. Signed-off-by: Daniel Semkowicz <dse@thaumatec.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
d85a91cf56
commit
d2c097c482
1 changed files with 17 additions and 23 deletions
|
@ -27,10 +27,12 @@ defined names and types without the need of prefixing them.
|
|||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <thread>
|
||||
|
||||
#include <libcamera/libcamera.h>
|
||||
|
||||
using namespace libcamera;
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
int main()
|
||||
{
|
||||
|
@ -506,35 +508,27 @@ and queue all the previously created requests.
|
|||
for (std::unique_ptr<Request> &request : requests)
|
||||
camera->queueRequest(request.get());
|
||||
|
||||
Start an event loop
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
Event processing
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The libcamera library needs an event loop to monitor and dispatch events
|
||||
generated by the video devices part of the capture pipeline. libcamera provides
|
||||
its own ``EventDispatcher`` class (inspired by the `Qt event system`_) to
|
||||
process and deliver events generated by ``EventNotifiers``.
|
||||
libcamera creates an internal execution thread at `CameraManager::start()`_
|
||||
time to decouple its own event processing from the application's main thread.
|
||||
Applications are thus free to manage their own execution opportunely, and only
|
||||
need to respond to events generated by libcamera emitted through signals.
|
||||
|
||||
.. _Qt event system: https://doc.qt.io/qt-5/eventsandfilters.html
|
||||
.. _CameraManager::start(): https://libcamera.org/api-html/classlibcamera_1_1CameraManager.html#a49e322880a2a26013bb0076788b298c5
|
||||
|
||||
The libcamera library implements this by creating instances of the
|
||||
``EventNotifier`` class, which models a file descriptor event source registered
|
||||
to an ``EventDispatcher``. Whenever the ``EventDispatcher`` detects an event on
|
||||
a notifier it is monitoring, it emits the notifier's
|
||||
``EventNotifier::activated`` signal. The libcamera components connect to the
|
||||
notifiers' signals and emit application visible events, such as the
|
||||
``Camera::bufferReady`` and ``Camera::requestCompleted`` signals.
|
||||
|
||||
The code below retrieves a reference to the system-wide event dispatcher and for
|
||||
the a fixed duration of 3 seconds, processes all the events detected in the
|
||||
system.
|
||||
Real-world applications will likely either integrate with the event loop of the
|
||||
framework they use, or create their own event loop to respond to user events.
|
||||
For the simple application presented in this example, it is enough to prevent
|
||||
immediate termination by pausing for 3 seconds. During that time, the libcamera
|
||||
thread will generate request completion events that the application will handle
|
||||
in the ``requestComplete()`` slot connected to the ``Camera::requestCompleted``
|
||||
signal.
|
||||
|
||||
.. code:: cpp
|
||||
|
||||
EventDispatcher *dispatcher = cm->eventDispatcher();
|
||||
Timer timer;
|
||||
timer.start(3000);
|
||||
while (timer.isRunning())
|
||||
dispatcher->processEvents();
|
||||
std::this_thread::sleep_for(3000ms);
|
||||
|
||||
Clean up and stop the application
|
||||
---------------------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue