2012-01-27 3 views
0

Мы пытаемся написать простой мессенджер и столкнулись с проблемой. Наша программа вылетает, когда мы вызываем перерисовку из другого потока. Вот часть нашего кодаСбой при вызове qwidget :: repaint()

`

//client.cpp 
#include "main_window.h" 
extern main_window * m_parent; //m_parent in main_window constructor get assigned with this 
std::list<std::string> m_online_contacts; 

void client::contacts(std::string str) 
{ 
    m_online_contacts.clear(); 
    std::string user_n = ""; 
    size_t j = 0; 
    size_t size = str.size(); 
    j = str.find(':'); 
    if (size > 2){ 
     str = str.substr(j + 1); 
     j = str.find(':'); 
     while(j != std::string::npos){ 
      user_n = str.substr(0, j); 
      m_online_contacts.push_back(user_n); 
      str = str.substr(j + 1); 
      j = str.find(':'); 
     } 
     m_online_contacts.push_back(str); 
    } 
    if(m_parent) 
     m_parent->create_contacts(m_online_contacts); 
} 



//main_window.cpp 

void main_window::create_contacts(std::list< std::string> l) 
{ 
    for(int j = 0; j < m_count; ++j){ //m_count is a count of on-line users 
     if(m_users[j]) { //m_users[] is a list of users to be shown 
      delete m_users[j]; 
     } 
    } 
    if(m_users) { 
     delete [] m_users; 
    } 
    m_count = 0; 
    std::list <std::string> :: iterator it = l.begin(); 
    if(l.size() == 0) { 
     m_users = new m_label* [1]; 
     m_users[0] = new m_label(QString::fromStdString("No online contacts")); 
    m_layout->addWidget(m_users[0]); 
     m_count = 1; 
    } 
    else { 
     m_users = new m_label * [l.size()]; 
     for (int i = 0; it != l.end(); ++it) { 
      m_users[i] = new m_label (QString::fromStdString(*it)); 
      m_layout->addWidget(m_users[i++]); 
      ++m_count; 
     } 
    } 
    this->repaint(); 
} 

` client.cpp и main_window.cpp различные файлы и работать в разных потоках

и вот сообщение аварии

QObject::setParent: Cannot set parent, new parent is in a different thread 
QObject::setParent: Cannot set parent, new parent is in a different thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
Segmentation fault 
+2

он падает, потому что вы не можете этого сделать. Есть хорошие материалы по этому вопросу на qt.nokia.com. – UmNyobe

+0

вот что происходит, когда вы не читаете документы! –

ответ

0

Я не эксперт qt, но похоже, что qt не хочет, чтобы вы возились с окнами (перекрашиванием) вне потока графического интерфейса. Это кажется мне разумным, потому что в коде окна должно быть тонна замков, чтобы сделать его безопасным. Не следует ли переписывать основной поток графического интерфейса самостоятельно?

+0

Нам нужно, чтобы окно было перекрашено при вызове client :: contacts. Как мы это сделаем? – cinemarter

+0

SO содержит много вопросов о потоках и qt. Например, этот вопрос со вчерашнего дня имеет для вас также ответ: http://stackoverflow.com/questions/9018434/qthread-doesnt-work-well –

Смежные вопросы