[H-GEN] pyglet and socket events
Peter Robinson
pjr at itee.uq.edu.au
Thu May 1 17:33:24 EDT 2008
Thanks Stephen - that's most helpful. Unfortunately on further
investigation there seems to be a bug when running a pyglet app
under Ubuntu and Compiz - the window frame is missing :(
Peter
Stephen Thorne wrote:
> On Thu, May 1, 2008 at 11:33 AM, Peter Robinson <pjr at itee.uq.edu.au> wrote:
>
>> Hi,
>> I am considering using pyglet for a visualisation that responds to
>> messages over a socket. The pyglet doco I have read doesn't say anything
>> about socket events. Anyone had any experience that would help me?
>>
>
> If you use pyglet.app.run() to run your pyglet application, which is
> the recommended way now, it will automatically use the correct
> EventLoop object. The one that I looked at was from
> pyglet.app.xlib.XlibEventLoop.
>
> You can substitute or subclass this event loop to do more than listen
> for xlib events.
>
> I would suggest that you would need to modify this section of code:
> (I have no doubts at all that gmail will mangle the indentation)
>
> for display in displays:
> if xlib.XPending(display._display):
> pending_displays = (display,)
> break
> else:
> # None found; select on all file descriptors or timeout
> iwtd = self.get_select_files()
> pending_displays, _, _ = select.select(iwtd, (), (), sleep_time)
>
> That code is relatively opaque (note the use of 'for/else' - very rare
> in python code), but what it is essentially doing is figuring out if
> any events are pending on the X server. The rest of the loop is
> handling those events.
>
> If you modified this code so that if there are XPending events, you
> also did a nonblocking select() on your sockets, and if there are no
> XPending events, just add your sockets to the list returned from
> 'get_select_files()' and then handle the results of that select
> sanely, you would be able to do proper asynchronous network
> communication from within the pyglet EventLoop.
>
> Further work will involve adding and removing sockets from the event
> loop. Global lists or a reference to the event loop somewhere will be
> required for this.
>
> Once you have your PeterRobinsonEventLoop subclass, you can either
> call it explicitly (PeterRobinsonEventLoop().run()) or you can do
> pyglet.app.EventLoop = PeterRobinsonEventLoop and then run
> pyglet.app.run() normally.
>
> Looking at this, it's tempting to sit down and write a version that
> works within the twisted event loop. I think that will be relatively
> easy to hack together, and would remove a lot of the work required in
> manually handling the select.select() call...
>
>
More information about the General
mailing list