Alexander
March 10, 2020, 7:26 p.m.

Ошибка 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
The question is asked by the articleQt/C++ - Lesson 048. QThread — How to work with threads using moveToThread

Do you like it? Share on social networks!

2
Evgenii Legotckoi
  • March 10, 2020, 7:37 p.m.
  • (edited)
  • The answer was marked as a solution.

В уроке 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
    • March 10, 2020, 8:03 p.m.

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

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • AK
        April 1, 2025, 11:41 a.m.
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup