Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
1

QThread ошибка

25.08.2015, 23:06. Показов 1117. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте

У меня возникла следующая проблемка при создании потока. Получаю ошибку:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x1f81000), parent's thread is QThread(0x1d40290), current thread is QThread(0x201e3a0)


код mythread.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QtCore>
#include <sys/socket.h>
#include <cstdio>
#include <QTextEdit>
 
 
class mythread : public QThread
{
public:
    int sock;
    QTextEdit *outStream;
    mythread(const int _sock, QTextEdit* _outStream);
    void run();
    ~mythread(){
        this->exit();
    }
};
#endif // MYTHREAD_H
mythread.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "mythread.h"
 
mythread::mythread(const int _sock, QTextEdit* _outStream) : sock(_sock)
{
    outStream = _outStream;
 
}
 
void mythread::run(){
    char buf[1024];
    int count;
    while(true){
        count = recv(sock, buf, sizeof(buf), MSG_NOSIGNAL);
        if(count == -1){
            qDebug("Error recv.\n");
            break;
        }
        qDebug("Message from server: %s", buf);
        outStream->setText(outStream->toPlainText() +  QString(buf));
    }
}
Обявляю:
C++ (Qt)
1
2
th = new mythread(sock->getSockId(), ui->textEdit);
        th->start();
В консоле все работает. А здесь какая то лажа родительский поток какой то.
Только начал изучать потоки не судите строго.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2015, 23:06
Ответы с готовыми решениями:

[Qt] QThread ошибка создания потока.
Здравствуйте. Не так давно пишу на c++, а в частности на Qt. На данный момент реализовываю...

QThread
Всем день добрый! Есть программка, которая при загрузке должна расшифровать некоторые данные из...

QThread
Здравствуйте! Есть три разных потока (3 класса унаследованных от QThread). Прописав в одном из...

QThread
Доброго времени суток. Собственно вопрос. Метод (код ниже) создает динамически поток и объект...

6
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
26.08.2015, 03:12 2
Графические виджет нельзя использовать в потоках.
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
26.08.2015, 18:00  [ТС] 3
Ну может есть какой то способ?
Мне нужно выводит информацию в этот виджет.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
26.08.2015, 18:01 4
Выводите. Но в основном потоке.
Если нужна обработка длительная. Просто отправляйте текст сигналом из потока.
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
26.08.2015, 18:33  [ТС] 5
Не подскажите как отправить текст в основной поток?
Если я не могу использывать виджеты:
connect(this, SIGNAL(printText(QString)), /*что здесь?*/);
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
26.08.2015, 18:41 6
Lokki23, я так понимаю что с Qt вы вообще не знакомы?

Писать код влом, там все надо переделать.
Подсказки/google:
1) moveToThread
2) emit textChanged(myString);
3) connect(myClass, &MyClass::textChanged, this, &MainWindow::onTextChanged);
0
0 / 0 / 1
Регистрация: 16.11.2014
Сообщений: 85
26.08.2015, 22:23  [ТС] 7
Спасибо за подсказки. Буду розбираться.

Добавлено через 3 часа 35 минут
Сделал работает.

Файл mythread.h:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
class mythread : public QThread
{
    Q_OBJECT
public:
    int sock;
    mythread(const int _sock, QObject* parent = 0);
    void run();
    ~mythread(){
        this->quit();
    }
signals:
    void changeText(QString str);
};
Файл mythread.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mythread::mythread(const int _sock, QObject *parent) : QThread(parent),sock(_sock)
{
    moveToThread(this);
}
 
void mythread::run(){
    char buf[1024];
    int count;
    while(true){
        count = recv(sock, buf, sizeof(buf), MSG_NOSIGNAL);
        if(count == -1){
            qDebug("Error recv.\n");
            break;
        }
        qDebug("Message from server: %s", buf);
        QString str(buf);
        emit changeText(str);
    }
}
Ну и подключение:
C++ (Qt)
1
connect(th,SIGNAL(changeText(QString)), this, SLOT(onTextChanged(QString)));
Хотел спросить еще как убрать это:
QThread: Destroyed while thread is still running.
Я понимаю что тут написано.
Как выйти из этого потока перед основным? Разве функция this->quit(); это не должна делать?
0
26.08.2015, 22:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2015, 22:23
Помогаю со студенческими работами здесь

QThread
Добрый день! Почитал про класс QThread. В документации написано, что для того чтобы создать свой...

This и QThread
Привет. Допустима ли такая конструкция?: QThread *thread = new QThread;...

QThread
Всем доброго времени суток. Пишу IDE и нужно научиться останавливать запущенную программу, чтобы...

QThread
Добрый вечер. Работаю с приложением реального времени, использую набор потоков. Написал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru