Сбой при вызове qwidget :: repaint () - PullRequest
0 голосов
/ 27 января 2012

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

`

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

1 Ответ

0 голосов
/ 27 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...