[zeromq-dev] Anyone managed to use zeromq with Qt (QSocketNotifier) ?

Gaspard Bucher gaspard at teti.ch
Tue Sep 20 20:02:32 CEST 2011


On Tue, Sep 20, 2011 at 8:59 AM, Maciej Gajewski <maciej.gajewski0 at gmail.com
> wrote:

> I did it and it works nicely on Linux and Windows.
>
> You need to disable the notifier before calling ZMQ_EVENTS (and
> reading the message if available) and enable if afterwards.
>
> Pseudocode:
>
> void OnSocketReadable(zmqsocket, notifier)
> {
>    notifier.setEnabled(false);
>    CheckForEventsAndRead(zmqsocket);
>    notifier.setEnabled(true);
> }
>
> bool HasIncoming(zmqsocket)
> {
>    qint32 events = 0;
>    std::size_t eventsSize = sizeof(events);
>    zmqsocket.getsockopt(ZMQ_EVENTS, &events, &eventsSize);
>    return (events & ZMQ_POLLIN);
> }
>
> void CheckForEventsAndRead(zmqsocket)
> {
>    if (HasIncoming(zmqsocket))
>        ReadMessage(zmqsocket);
> }
>
> cheers,
>
> Maciek
>
> On 19 September 2011 19:41, Gaspard Bucher <gaspard at teti.ch> wrote:
> > Hi list !
> > I am trying to use zeromq with a Qt application and I want to avoid
> having
> > multiple threads
> > so I tried to use ZMQ_FD and pass this to QSocketNotifier but only the
> first
> > message is
> > signaled. My guess is that zmq does not keep the file descriptor in
> > read-ready state but
> > just signals the first element ?
> > Pseudo-code:
> > 1. get zmq fd
> > 2. create QSocketNotifier with 'Read' events
> > 3. app exec
> > ..
> > 4. first (or many) messages arrive
> > 5. ---> QSocketNotifier fires
> > 6. get 1 message
> > 7. wait for QSocketNotifier to fire again
> > 8. .... never happens
> > My guess is that there is something I do not understand regarding the
> ZMQ_FD
> > file descriptor.
> > Maybe it only retriggers "read-ready" if the queue has been emptied ?
> > Thanks for your help,
> >                                                                Gaspard
> >
> > _______________________________________________
> > zeromq-dev mailing list
> > zeromq-dev at lists.zeromq.org
> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> >
> >
>

Hi everyone !

Thanks for your support: I managed to create a scheduler that automagically
switches from zmq_poll to Qt's event loop. I have no idea how I could have
coded this in C/C++, but in Lua it works seamlessly thanks to coroutines.
Pseudo-code:

1. check for event (getsockopt...)
2. if event not ready
2.1 register filedescriptor in QSocketNotifier
2.2 ... yield
3. event is ready: recv

Real code (also makes sure the gui thread cannot be choked by an inbox that
is never emptied):

http://bit.ly/ovgAB7

When Qt is not loaded, I use zmq_poll for all sockets (posix, zmq) and
timers and it's all working like a charm. Choosing zmq for my network layer
was definitely very well inspired.

Thank you guys !
                                                               Gaspard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20110920/5f5cc8d0/attachment.htm>


More information about the zeromq-dev mailing list