l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
August 5: Social gathering
Next Installfest:
TBD
Latest News:
Jul. 4: July, August and September: Security, Photography and Programming for Kids
Page last updated:
2003 Dec 19 23:31

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] Xlib event loop
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] Xlib event loop



On Fri, Dec 19, 2003 at 01:51:10PM +1100, Julie Russell wrote:
> Hi there,
> 
> What I am doing is I am calling XPutImage from a threaded output class, and
> I want to keep it there for 20 seconds, then grab the next image, etc.
> However, these images can be interrupted by a keypress event, so while they
> are showing, I need to still get events from the event loop. I have my event
> handler as a non-threaded singleton class that can just be called when an
> event needs to be sent. The images sit on a child window, and the event
> handler listens to the parent. Should sleep on a child window of a detached
> thread class stop the event loop on the parent? Could it be from what you're
> saying that the XImage output is blocking the XEvent? If the sleep process
> if blocking it, then I would have to determine another way to count 20
> seconds for the blit.

I would guess that, yes, sleeping a thread which has an event loop could
block the whole application. Are you just calling sleep(20*blah) to
pause the thread?  If so, you may want to consider creating a
pthread-style mutex, then using pthread_mutex_timedwait().  Make the
timeout something small like 1 second or less. The loop could look like
this:

do
{
	struct timeval  now;
	struct timespec timeout;
	gettimeofday( &now, NULL );
	timeout.tv_sec  = now.tv_sec  + 1;
	timeout.tv_nsec = now.tv_usec * 1000;

	... Pump the event queue ...
}
while( pthread_mutex_timedwait( &mutex_handle, &timeout );

The "timedwait" pthread function will drop out once every one second
while the mutex is locked, allowing your application to keep the UI
active and events processing.

Check out VncSelector (http://www.dooglio.net/VncSelector, version 1.1)
for a code sample. I am using a pthread conditional instead of a mutex,
but it works out the same. When the conditional's signal is raised, that
terminates the runner thread. Otherwise it stays running.

I needed to be able to pop up a dialog box which says "Please Wait", but
when I tried fork, and waitpid() in the parent process, my application
would completely freeze and the wait dialog would look transparent.
Moving the fork() and waitpid() calls to a runner thread allowed me to
post the dialog correctly, then block for the child process to finish.
The interesting thing to note that while I'm doing a waitpid() in the
runner thread, the entire application blocks.

Hope this helps!

> 
> Thanks,
> Julie.
> 
> > -----Original Message-----
> > From: vox-tech-admin@lists.lugod.org
> > [mailto:vox-tech-admin@lists.lugod.org]On Behalf Of R. Douglas Barbieri
> > Sent: Friday, 19 December 2003 1:14 PM
> > To: vox-tech@lists.lugod.org
> > Subject: Re: [vox-tech] Xlib event loop
> >
> >
> > On Fri, Dec 19, 2003 at 11:47:00AM +1100, Julie Russell wrote:
> > > Hi Everyone,
> > >
> > > I am programming in c++ and xlib using common c++ threads. I
> > want to sleep a
> > > thread (which I have initiated as detached). During that
> > process I want to
> > > recieve events from the xlib event loop and if triggered, interrupt the
> > > sleeping thread, or if not interrupted, have the thread wake up
> > on it's own
> > > after 20 seconds. The problem is, while that thread is asleep, for some
> > > reason, my event loop appears to be blocked. How can I sleep a thread so
> > > that the loop doesn't block and then interrupt it cleanly. Why
> > does the xlib
> > > event loop appear to be blocked during this process.
> >
> > I can think of how I would do this in Win32 There is a API function
> > called PeekMessage() which "peeks" at the pending message waiting but
> > does not block. I would use that, but for sleeping the thread, use
> > WaitOnMultipleObjects().
> >
> > So, if there is a similar function for xlib which allows just a "peek,"
> > I would use it instead so that the thread doesn't block there. Then
> > use the pthread_cond_timeout() function to sleep. A signal to the
> > conditional object terminates the thread loop then.
> >
> > I read somewhere that X likes all X-related calls to happen in just one
> > thread. It could be that when you read the next event, it blocks because
> > there is other X activity in the other thread? Just a guess, really.
> >
> > >
> > > Thanks in advance,
> > > Julie.
> > >
> > >
> > >
> > > _______________________________________________
> > > vox-tech mailing list
> > > vox-tech@lists.lugod.org
> > > http://lists.lugod.org/mailman/listinfo/vox-tech
> >
> > --
> > R. Douglas Barbieri
> > doug@dooglio.net
> > http://www.dooglio.net
> >
> > GPG Fingerprint : FE6A 6A57 2B95 7594 E534  BFEE 45F1 9E5E F30A 8A27
> > MIT.edu recv-key: C55B91D4
> > GPG Public key  : http://www.dooglio.net/dooglio.asc
> >
> 
> 
> _______________________________________________
> vox-tech mailing list
> vox-tech@lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech

-- 
R. Douglas Barbieri
doug@dooglio.net
http://www.dooglio.net

GPG Fingerprint : FE6A 6A57 2B95 7594 E534  BFEE 45F1 9E5E F30A 8A27
MIT.edu recv-key: C55B91D4
GPG Public key  : http://www.dooglio.net/dooglio.asc

Attachment: pgp00010.pgp
Description: PGP signature



LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
Sunset Systems
Who graciously hosts our website & mailing lists!