I suppose you could use an idle function.  It would get called for each
iteration of the main loop, and should allow the signal handler to be
called.

Basically mainloop() runs this:
  while quit_flag != TRUE:
        mainiteration()
  call_quit_handlers()

The quit handlers aren't called by mainiteration, nor is checking for
calls to mainquit.

James Henstridge.

--
Email: [EMAIL PROTECTED]
WWW:   http://www.daa.com.au/~james/


On 24 Feb 1999, Hrvoje Niksic wrote:

> As you may have noticed, I'm writing a program that tries to track
> several of its children.  It gets notified of a child's death by
> SIGCHLD.  The problem is that Python signal processing is synchronous
> -- while in the C signal handler, Python simply queues the routine to
> be run at a later time.  In some cases, this doesn't matter because a
> callback gets run because of the file descriptors that got closed.
> But in other cases, such as exec-ing "sleep 1", the subprocess' death
> goes unnoticed until the first time a Python callback is invoked.
> 
> I think this is fixable because of the fact that a signal will
> interrupt glib's poll.  I'd love to be able to specify code to be run
> between iterations.  The code would be a no-op, but it would be enough
> to let Python flush its queue.  For instance:
> 
>     # Setup a dummy function that gives Python a chance to flush its
>     # signal queues.
>     iteration_add (lambda *args: TRUE)
> 
> Since I haven't found a way to do this, I tried a different approach;
> writing a mainloop myself, using the blocking version of
> gtk_main_iteration().  It looks like this:
> 
> class MainLoop:
>     def __init__ (self):
>         self.running = 1
>         quit_add (1, self.__reset)
>         while self.running:
>             mainiteration (block = TRUE)
> 
>     def __reset (self):
>         print "called"
>         self.running = 0
> 
> This code works nice as it is -- the death of "sleep 1" is now
> noticed.  The problem is that the above loop never exits because
> calling mainquit() doesn't invoke MainLoop.__reset__!  It was quite a
> shock to find out that mainquit() doesn't bother to call the stuff
> registered with quit_add(), even though mainiteration() is in
> progress.
> 
> I wonder if that's a bug or a feature...
> To unsubscribe: echo "unsubscribe" | mail [EMAIL PROTECTED]
> 

To unsubscribe: echo "unsubscribe" | mail [EMAIL PROTECTED]

Reply via email to