Thanks.

I forgot to remind you of important details.  For one I forget to
mention that the “sleep(10)” function represented a function that is
processing such as searching all the network drives for a string and
doing other chores that might take up to three hours or more.

Then when it gets back it's supposed to update the gui screen and
console.

I thought I had tested run(mylabel) and had problems.  I should have
left the line there commented out.  But I'm glad to see that your update
prints.  However, it prints all the text at once.  It doesn't print
anything after a function.

I uncommented the sleep(10) function.  There is no window until the
function ends.  Then everything is printed.

So if the user ran the program he would have no idea what is happening
until three hours later.  He might try to run the application numerous
times to get something on the screen and really cause problems.

My objective is to immediately print something on the gui.  Then run
functions.  The print and update to the gui, the same way you see the
console output updated.

And yes.  I appreciate anything I can learn about those terms
(threading, etc), especially if this is what is going to be needed to
update what is on the gui.

I'm adding what might be a clearer description of what I'm trying to do
to your new code that prints.

Most likely the threading is where the sleep() and myprocess1()
functions should be.

// 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;
};

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();
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;

myprocess1();

cout << "Window should be displayed" << endl;
}
myLabel::~myLabel()
{
}
void myprocess1()
{
cout << "Running another process that is generating output..." << endl;
}

int main(int argc, char* argv[])
{
     Gtk::Main kit(argc, argv);

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

-- L. James

-- 
L. D. James
lja...@apollo3.com
www.apollo3.com/~ljames


On Fri, 2013-08-02 at 15:05 -0700, Alan Mazer wrote: 

> This is tricky to explain, but, in a nutshell, myLabel, because it's 
> derived from Gtk::Window, is itself a window you can pass to "run". You 
> don't want to create a separate Gtk::Window object as you're doing, 
> because "run" can't see it.  I've removed the "Gtk::Window window;" 
> line, and changed "window.set_title" to just "set_title", and 
> "window.add" to just "add".  With these changes, there's text in your 
> window.  I'll include the code below so you can see what I did.  (I also 
> needed to change back to the "kit" approach in "main" which you had 
> originally, because I don't have gtkmm 3 on my computer, but you can 
> keep your "main" routine using the newer approach if you prefer.)
> 
> Do you want me to show you threading or would you prefer to explore that 
> on your own?
> 
> -- Alan
> 
> #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;
> };
> 
> 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();
> 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;
> cout << newtext << endl;
> 
> myprocess1();
> 
> cout << "Window should be displayed" << endl;
> }
> myLabel::~myLabel()
> {
> }
> void myprocess1()
> {
> cout << "Running another process that is generating output..." << endl;
> }
> 
> int main(int argc, char* argv[])
> {
>      Gtk::Main kit(argc, argv);
> 
>      myLabel mylabel;
>      Gtk::Main::run(mylabel);
>      return 0;
> }
> 


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

Reply via email to