Alexander
10 марта 2020 г. 19:26

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

потоки

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

  1. #ifndef GUICORE_HPP
  2. #define GUICORE_HPP
  3.  
  4. #include <QMainWindow>
  5. #include <QMessageBox>
  6. #include <QDialog>
  7. #include <QDialogButtonBox>
  8. #include <QLineEdit>
  9. #include <QGroupBox>
  10. #include <QFormLayout>
  11. #include <QThread>
  12.  
  13. #include "swcore.hpp"
  14.  
  15. struct ptClientListOnForm{
  16. QHBoxLayout *pt;
  17. QLabel *laId;
  18. QLabel *laName;
  19. int id;
  20. };
  21.  
  22. QT_BEGIN_NAMESPACE
  23. namespace Ui { class GUICore; }
  24. QT_END_NAMESPACE
  25.  
  26. class GUICore : public QMainWindow
  27. {
  28. Q_OBJECT
  29.  
  30. public:
  31. GUICore(QWidget *parent = nullptr);
  32. ~GUICore();
  33.  
  34. QString timeStamp();
  35.  
  36. signals:
  37. void setPortServ(int port);
  38. void setAddrServ(quint32 ipAddr);
  39. void startServ(QThread::Priority pr = QThread::LowPriority);
  40. void shutdownServer();
  41.  
  42. private slots:
  43. void addToPlaneText(QString msg);
  44. void isAlive(bool alive);
  45. void newConnectionClient (int id,QString name);
  46. void deleteConnectionClient (int id);
  47. void on_pushButtonStartServer_clicked();
  48. void on_pushButtonShutDownServer_clicked();
  49. void on_pushButtonExit_clicked();
  50.  
  51. private:
  52. Ui::GUICore *ui;
  53. SWCore *swc;
  54. QThread *sysThread;
  55. ptClientListOnForm ptCl;
  56. QVector <ptClientListOnForm> arrPtCl;
  57. };
  58. #endif // GUICORE_HPP
  59. ///это хедор

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

  1. GUICore::GUICore(QWidget *parent)
  2. : QMainWindow(parent)
  3. , ui(new Ui::GUICore)
  4. {
  5. ui->setupUi(this);
  6. swc = new SWCore;
  7. connect(this,&GUICore::startServ,sysThread,&QThread::start);
  8. connect(sysThread,&QThread::start,swc,&SWCore::slotStartServer);
  9. connect(sysThread,&QThread::terminate,swc,&SWCore::slotStopServer);
  10. swc->moveToThread(sysThread);
  11. }

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

2
Вопрос задан по статьеQt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

Вам это нравится? Поделитесь в социальных сетях!

2
Evgenii Legotckoi
  • 10 марта 2020 г. 19:37
  • (ред.)
  • Ответ был помечен как решение.

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

Так на стеке

  1. class MainWindow : public QMainWindow
  2. {
  3. Q_OBJECT
  4.  
  5. public:
  6. explicit MainWindow(QWidget *parent = 0);
  7. ~MainWindow();
  8.  
  9. private slots:
  10.  
  11. private:
  12. QThread thread_1; // Объект создаётся в стеке класса
  13. };

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

  1. class MainWindow : public QMainWindow
  2. {
  3. Q_OBJECT
  4.  
  5. public:
  6. explicit MainWindow(QWidget *parent = 0);
  7. ~MainWindow();
  8.  
  9. private slots:
  10.  
  11. private:
  12. QThread* thread_1; // Объект создаётся в стеке класса
  13. };

Создаём

  1. GUICore::GUICore(QWidget *parent)
  2. : QMainWindow(parent)
  3. , ui(new Ui::GUICore)
  4. {
  5. ui->setupUi(this);
  6. swc = new SWCore;
  7. sysThread = new QThread();
  8. connect(this,&GUICore::startServ,sysThread,&QThread::start);
  9. connect(sysThread,&QThread::start,swc,&SWCore::slotStartServer);
  10. connect(sysThread,&QThread::terminate,swc,&SWCore::slotStopServer);
  11. swc->moveToThread(sysThread);
  12. }

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

  1. GUICore::~GUICore()
  2. {
  3. sysThread->deleteLater();
  4. }
  5.  
    Alexander
    • 10 марта 2020 г. 20:03

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

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      • Последние комментарии
      • IscanderChe
        12 апреля 2025 г. 17:12
        Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
      • AK
        1 апреля 2025 г. 11:41
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        9 марта 2025 г. 21:02
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        9 марта 2025 г. 16:14
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        22 ноября 2024 г. 21:51
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…