Alexander10 марта 2020 г. 9:26

Ошибка c QThread, программа крашится при старте

потоки

Собственно шел по уроку 048 (кажется где перемещяют объект в поток) и столкнулся с падение программы на этапе коннектов как я понял. собственно вот код

#ifndef GUICORE_HPP
#define GUICORE_HPP

#include <QMainWindow>
#include <QMessageBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QLineEdit>
#include <QGroupBox>
#include <QFormLayout>
#include <QThread>

#include "swcore.hpp"

struct ptClientListOnForm{
    QHBoxLayout *pt;
    QLabel *laId;
    QLabel *laName;
    int id;
};

QT_BEGIN_NAMESPACE
namespace Ui { class GUICore; }
QT_END_NAMESPACE

class GUICore : public QMainWindow
{
    Q_OBJECT

public:
    GUICore(QWidget *parent = nullptr);
    ~GUICore();

    QString timeStamp();

signals:
    void setPortServ(int port);
    void setAddrServ(quint32 ipAddr);
    void startServ(QThread::Priority pr = QThread::LowPriority);
    void shutdownServer();

private slots:
    void addToPlaneText(QString msg);
    void isAlive(bool alive);
    void newConnectionClient (int id,QString name);
    void deleteConnectionClient (int id);
    void on_pushButtonStartServer_clicked();
    void on_pushButtonShutDownServer_clicked();
    void on_pushButtonExit_clicked();

private:
    Ui::GUICore *ui;
    SWCore *swc;
    QThread *sysThread;
    ptClientListOnForm ptCl;
    QVector <ptClientListOnForm> arrPtCl;
};
#endif // GUICORE_HPP
///это хедор

и кусок где происходит краш

GUICore::GUICore(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::GUICore)
{
    ui->setupUi(this);
    swc = new SWCore;
    connect(this,&GUICore::startServ,sysThread,&QThread::start);
    connect(sysThread,&QThread::start,swc,&SWCore::slotStartServer);
    connect(sysThread,&QThread::terminate,swc,&SWCore::slotStopServer);
    swc->moveToThread(sysThread);
}

Линка на весь проект если поможет

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
2

В уроке 048 QThread объект существует в стеке класса, а вы создаёте в куче. То есть в уроке объект существует перед коннектом, а в вашем случае протухший указатель, который вместо объекта содержит мусор.

Так на стеке

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

private:
    QThread thread_1;       // Объект создаётся в стеке класса
};

Так в куче (heap), требуется создавать объект через оператор new, и соответственно контролировать удаление, чтобы не было утечек памяти

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

private:
    QThread* thread_1;       // Объект создаётся в стеке класса
};

Создаём

GUICore::GUICore(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::GUICore)
{
    ui->setupUi(this);
    swc = new SWCore;
    sysThread = new QThread();
    connect(this,&GUICore::startServ,sysThread,&QThread::start);
    connect(sysThread,&QThread::start,swc,&SWCore::slotStartServer);
    connect(sysThread,&QThread::terminate,swc,&SWCore::slotStopServer);
    swc->moveToThread(sysThread);
}

И нужно будет в деструкторе потом удалять

GUICore::~GUICore()
{
    sysThread->deleteLater();
}

Мда проглядел z что не создал поток( моя вина

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
R

C++ - Тест 002. Константы

  • Результат:75баллов,
  • Очки рейтинга2
R

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
MS

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
Последние комментарии
V

Django - Урок 027. Добавление Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Урок 001. Как собрать все DLL, используемые в Qt-проекте?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Сейчас обсуждают на форуме

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…

Qt + OpenGL glDeleteVertexArrays

Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать. И ещё виджет стоит удалять через метод deleteLater() а не п…

QWebEngineView не запускается если к ПК подключено несколько мониторов

Ну я имел ввиду посмотреть на другом ПК с другой графикой и парой мониторов. Как моей программе назначить использовать определенный граф. адаптер? Вот тут понятия не имею.

Счечик производительности сети

Хорошо. После работы сегодня гляну ваш код внимательно.
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB