LINUX.ORG.RU

Избранные сообщения neutrino

Qt + posix threads, непредсказуемое поведение программы

Форум — Development

Привет. Пишу простой мессенджер на c++/Qt, POSIX threads, POSIX sockets, платформа Linux Ubuntu 12.04. Вопрос... Можно ли передать указатель основного потока Qt программы в posix thread, вот листинг

#include <QApplication>
#include "MainWindow.hpp"
#include "pthread.h"
#include <signal.h>
#include <QEvent>
#include <QObject>
#include "MessageEvent.hpp"


//pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


void handler_sigsegv(int signum)
{
    QMessageBox m_msg;
    m_msg.warning(0,"Warning", "SIGSEGV Error!","POSIX Signal");

    signal(signum, SIG_DFL);
    exit(3);
}

void* users(void* pt)
{    
  MainWindow* temp = (MainWindow*)pt;// переданный потоку параметр-указатель класса главного окна

   while(1)
   {
            if(1 == temp->get_login_status())// проверяем залогинился ли юзер
            { 
                QString string = temp->_receving();// ждем и получаем входящее сообщение
                if(NULL != string)
                {
                    // функция temp->getHistoryObj() возвращает указатель на QTextEdit
                    QMetaObject::invokeMethod(temp->getHistoryObj(), "insertPlainText"  ,Q_ARG(QString, string));// выводим в QTextEdit
                    QMetaObject::invokeMethod(temp->getHistoryObj(), "insertPlainText",Q_ARG(QString, "\n"));                   
                }                
            }
   }

}
int main(int argc, char** argv)
{
    signal(SIGPIPE, SIG_IGN);// сигнал sigpipe
    QApplication app(argc, argv);
    signal(SIGSEGV, handler_sigsegv);
    MainWindow* m = new MainWindow; //указатель на класс главного окна

    pthread_t pt;
    m->show();
    int res = pthread_create(&pt, NULL, &users, (void*)m); // создаем поток для получения входящих сообщений

    return app.exec();
}
Проблема в том что, что иногда прогрмма ведет себя непредсказуемо, не часто но бывает что сервер отправляет сообщение а тут клиент падает хотя минуты назад тот же клиент сообщение норм получало....Debuger -ом проверяю оказывается функция сокета recv возвращает -1, хотя минуты назад снова было все норм recv возвращала valid count байтов. тут у меня указатель класса главного окна MainWindow* m передается в posix поток. В потоке жду входящего сообщения. Если сообщение пришло то функция _receving() возвращает входящее сообщение ввиде строки QString. А методами QMetaObject::invokeMethod строка выводится в QTextEdit. Может не так-уж корректна передача указателя главного потока (main) Qt класса в posix поток void* users(void* pt) ?

neutrino
()