Hello,

This is my first post on this list, but not last :). I would be 
thankful, if you help me in solving my problem.

I use, gtkmm-2.4 and i'm writing a simple InstantMessager. I created a 
simple GUI using glademm and everything works fine, but i wanted to open 
conversation window when someone send message, so i created method which 
check for new messages and if there is some message it create new 
"conversation window". I run this method in new thread...and then the 
problem started. When method call "ConversationWindow" constructor, i 
receive many errors from GTK. I think method is okay(if i call this 
method without creating a new thread everything works fine, but app 
hangs up :) ).



Console(When new message arrived, and Conversation() is called.:

(linqq:7237): Gtk-CRITICAL **: gtk_text_attributes_ref: assertion 
`values != NULL' failed

(linqq:7237): Gtk-CRITICAL **: gtk_text_attributes_ref: assertion 
`values != NULL' failed

(linqq:7237): Pango-CRITICAL **: pango_layout_new: assertion `context != 
NULL' failed



Debuger:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1223346496 (LWP 7244)]
0xb7b62e89 in gtk_text_layout_validate () from /usr/lib/libgtk-x11-2.0.so.0



The code is:

ConversationManager ( it's class which manage conversation windows(If 
some window is already created it activate it. or create new)
/**
That create new Window(This works fine, when i run it from main thread.

newAccount - is from network code of my IM.
*/
void ConversationManager::newConversation(unsigned int newNumber, char 
*message, Account *newAccount)
{
    int size = conversations.size();
    if(size > 0)
    {
        for(int i = 0; i < size; i++)
        {
            if(conversations[i]->getNumber() == newNumber)// This works 
fine, even in new thread(If i create newWindow from main thread and 
someone send message this code works fine in new thread)
            {
                conversations[i]->show();
                conversations[i]->addMessage(message);
                return;
            }
        }
    }
    Conversation *newConversation = new Conversation(); // Conversation 
is class generated by glademm(conversation window class). That generate 
error :/
    newConversation->setAccount(newAccount); //-----------------------------
    newConversation->setNumber(newNumber); //nothing important
    newConversation->addMessage(message);// ------------------
    newConversation->show();
    conversations.push_back(newConversation); // It's a array of 
pointers for conversation windows
    user = newAccount; //nothing important
}

/**
I call this method in new thread.
*/
void ConversationManager::waitForMessages()
{
    Message temp; // From network part of IM.
    if(user != 0 && !waiting)
    {
        waiting = true;
        for(;;)
        {
            if(user->getMessageQueueLength() > 0) // If is there any 
messages
            {
                temp = user->getMessageFromQueue();
               
                
newConversation(temp.getSender(),temp.getMessage(),this->user); // 
Create new window!
            }
        }   
    }
}



I think Conversation and Conversation_glade() is good beacause it's 
generated by glademm. Now my question is. How to create window in new 
thread? Please help me.

PS: Sorry for my english.

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to