Ah. You need to call the thread init routine first. Can't remember the syntax 
now. Perhaps someone else can remind me or I'll check later when I get back to 
my office.

Sent from my Android phone using TouchDown (www.nitrodesk.com)

-----Original Message-----
From: L. D. James [lja...@apollo3.com]
Received: Monday, 05 Aug 2013, 12:05pm
To: Mazer, Alan S (389M) [alan.s.ma...@jpl.nasa.gov]
CC: gtkmm-list@gnome.org [gtkmm-list@gnome.org]
Subject: Re: How to update both the Console and the GTKMM gui window after 
running other functions

Thanks, Alan.  It compiles without errors.  When run I get this error at the 
console:

        Threads aren't supported!

// c++ code begin
// -----------------------------------------------------------
#include <gtkmm.h>
#include <iostream>

using namespace std;

class myLabel: public Gtk::Window
{
// blah blah blah
public:
myLabel();
virtual ~myLabel();

protected:
Gtk::Label m_label;
string labeltext;
string newtext;
void myprocess1(void);
};

myLabel::myLabel() :
m_label("Hello World")
{
// myLabel.set_text("hello"); // This line gives errors (*1)
void myprocess1();

set_title("Gtkmm Programming - C++");
add(m_label);

m_label.show();

Glib::Thread::create(sigc::mem_fun(*this, &myLabel::myprocess1), true);

cout << "Window should be displayed" << endl;
}

myLabel::~myLabel()
{
}

void myLabel::myprocess1(void)
{
labeltext = "About to preform a number of processes.\n";
labeltext += "Each process may take up to three hours.\n";
labeltext += "Please carry your daily chores and wait.\n";
cout << labeltext << endl;
m_label.set_text(labeltext);

sleep(10); // Back from a three hour function
newtext = "Back from a three hour function\n";
labeltext += newtext;
m_label.set_text(labeltext);
cout << newtext << endl;

sleep(10); // Back from a three hour function
newtext = "Back from another three hour function\n";
labeltext += newtext;
m_label.set_text(labeltext);
cout << newtext << endl;
}

int main(int argc, char* argv[])
{
if (!Glib::thread_supported())
Glib::thread_init();
else
{
cerr << "Threads aren't supported!" << endl;
exit(1);
}

Gtk::Main kit(argc, argv);

myLabel mylabel;
Gtk::Main::run(mylabel);
return 0;
}
// -----------------------------------------------------------
// c++ code end

-- L. James

--
L. D. James
lja...@apollo3.com<mailto:lja...@apollo3.com>
www.apollo3.com/~ljames

On Mon, 2013-08-05 at 08:18 -0700, Alan Mazer wrote:


Take a look at this.  It still doesn't have dispatchers (I'm trying to
keep it simple).  It's possible for this program to crash if you try to
interact with the window while it's updating.  Dispatchers prevent
that.  But this should be otherwise functional, and I didn't want adding
dispatchers to make understanding the thread concept more difficult.
Adding dispatchers is just one more step.

All I did here was put your long-running computation into a secondary
thread, and have that thread update your label.

The problem with your previous approach is that what "run" does is
display the window and label you've created and then wait for you to
interact with the window.  If you put your computation *before* the
"run", the window won't be displayed until your computation ends. If you
put your computation *after" the "run", it won't be executed until you
close the window.

You can also put your computation *in* the window creation, but this
means that the program won't be handling any user interactions during
your computation.  If you cover the window with another window, for
example, and then uncover it again, it will probably be blank until your
computation is over.  Or if you had a button in the window, button
presses would be ignored until the computation was over.

What you want is for your computation to be going on at the same time as
"run" is handling user interaction, both of them working together.  So
we create a "thread", which is a separate function that runs
simultaneously with the "run".

I hope this helps.  You probably want to switch from a label to
something with scroll bars.

-- Alan



_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to