Мы пытаемся написать простой мессенджер и столкнулись с проблемой.Наша программа падает, когда мы вызываем перерисовку из другого потока.Вот часть нашего кода
`
//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