[gtk-win32] g_idle_add() weirdness
- From: "John Emmas" <johne53 tiscali co uk>
- To: <gtk-win32-list gnome org>
- Subject: [gtk-win32] g_idle_add() weirdness
- Date: Tue, 9 Feb 2010 17:22:10 -0000
I've written a small test app which just consists of a dialog with a button
and a progress bar. When the user presses the button I want a worker thread
to update the progress bar periodically. I'm experienced enough to know
that it's not a good idea to modify GUI elements from a worker thread
because the app tends to crash if (say) the user moves or resizes the main
window whilst the worker thread is running. Under MFC I would solve this
problem by sending messages but I wasn't sure how to tackle it under GTK.
Someone suggested that I update the GUI by means of idle processing, using
'g_idle_add()'. In other words, I set up a function within the worker
thread to receive periodic notifications. That function then calls
g_idle_add() to schedule another function which updates the progress bar
(theoretically within the GUI thread's idle time). Here's how it looks:-
pthread_t UIthreadID; // Global - gets set elsewhere in the program
pthread_t WTthreadID; // Global - gets set elsewhere in the program
pthread_t thisThreadID; // Global - for comparison purposes
gboolean MainWindow::idle_set_progress(gpointer _pValue)
{
// In theory, this function should be executing
// from within the GUI thread
thisThreadID = pthread_self();
if ((m_pProgress) && (_pValue))
{
double* pNewValue = static_cast<double*>(_pValue);
double new_value = *pNewValue;
m_pProgress->set_fraction (new_value);
}
return (false);
}
// This is the other function. It periodically receives signals emitted
// by the worker thread. It runs as part of the worker thread.
void WorkerThreadNotification(double fraction) const
{
// Add some idle processing for the main loop
g_idle_add(MainWindow::idle_set_progress,
¤tProgressValue);
}
Notice that I've set up some 'threadID' variables so that I can check which
thread is executing idle_set_progress(). I've built the program under
Linux, Cygwin and Windows (each using their respective versions of GTK).
Under Linux and Cygwin, 'idle_set_progress()' does get executed in the GUI
thread, exactly as expected. But under gtk-win32 it gets executed in the
worker thread. Is this a known problem with the gtk-win32 build? More
importantly.... is there a fix??
Thanks,
John
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]