не может излучать сигнал из класса, вызываемого потоком в QT

#c #multithreading #qt #signals-slots

Вопрос:

Я создал поток, который инициирует класс и запускает некоторые методы этого класса. класс был первоначально создан в консольном приложении VS, а затем я перенес свой проект в QT.

ОЧЕНЬ СОЖАЛЕЮ ЗА ЭТОТ ДЛИННЫЙ ПОСТ

//главное окно.h

 #ifndef MAINWINDOW_H #define MAINWINDOW_H  #include lt;QMainWindowgt;  #include "serverstart.h"  QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE  class MainWindow : public QMainWindow {  Q_OBJECT  signals:  public slots:  void serverStartedSlt();  public:  QThread *mythread;  ServerStart *serverstart;  MainWindow(QWidget *parent = nullptr);  ~MainWindow();  private:  Ui::MainWindow *ui;  private slots:  void on_pushButton_clicked(); }; #endif // MAINWINDOW_H   

//mainwindow.cpp

 #include "mainwindow.h" #include "ui_mainwindow.h"  //for server start thread #include lt;QThreadgt;   MainWindow::MainWindow(QWidget *parent)  : QMainWindow(parent)  , ui(new Ui::MainWindow) {  ui-gt;setupUi(this);  }  MainWindow::~MainWindow() {  delete ui; }   void MainWindow::serverStartedSlt(){  ui-gt;pushButton-gt;setText("Stop Server");  ui-gt;pushButton-gt;setStyleSheet("background:red;"); }  void MainWindow::on_pushButton_clicked() {  serverstart = new ServerStart();  mythread = new QThread(this);  serverstart-gt;moveToThread(mythread);  QObject::connect(mythread, amp;QThread::started, serverstart, amp;ServerStart::run);  //this is what would connect mysignal from server.cpp with mainwindow.cpp to edit in the UI  QObject::connect(serverstart, amp;ServerStart::serverStartedSig, this, amp;MainWindow::serverStartedSlt);  mythread-gt;start(); }  

here is what i run in my thread.

//serverstart.h

 #ifndef SERVERSTART_H #define SERVERSTART_H  #include lt;QDebuggt;  class ServerStart : public QObject {  Q_OBJECT  signals:  //adding signal again in serverstart.h  void serverStartedSig();  public:  explicit ServerStart(QObject *parent = nullptr);  ~ServerStart();  public slots:  void run();  };  #endif // SERVERSTART_H  

//serverstart.cpp

 #include "server.h" //my server class #include "serverstart.h"  ServerStart::ServerStart(QObject *parent) : QObject(parent) {  }  ServerStart::~ServerStart(){  }  void ServerStart::run() {  qInfo() lt;lt; "nthread is runningn";   Server MyServer(4040, true);  MyServer.ListenForNewConnection();   MyServer.HandleInput(); //while(true) loop   qInfo() lt;lt; "nthread stopedn";  this-gt;deleteLater(); }  

here is the class I included in my thread class. it was made in VS console app, then I copied it as is. //server.h

 #pragma once #pragma comment(lib,"ws2_32.lib") //a lot of headers  //for definig signals #include lt;QDebuggt;  //simple connection class class Connection {  };  //the server class used and i want to emit the signal from it class Server : public QObject //derivnig from QObject {  Q_OBJECT //adding the macros  signals:  //defining the signal  void serverStartedSig();  public:  //these what i use in my thread class  Server(int PORT, bool BroadcastPublically = false);    void ListenForNewConnection();  void HandleInput();  static Server * serverptr;  private:  //a lot of methods };  

//server.cpp

 #include "server.h" //other headers  Server* Server::serverptr;  Server::Server(int PORT, bool BroadcastPublically) {  //emitting the signal  emit serverStartedSig();  //init winsock  //bind, listen    //low level thread.  _beginthreadex(NULL, NULL, (_beginthreadex_proc_type)PacketSenderThread, NULL, NULL, NULL); }   

когда я создаю новый класс сервера и использую его вместо этого, он выдает ошибку в файле server.obj, я думаю, это из-за конструктора, созданного в приложении VS console. Server(int PORT, bool BroadcastPublically)

Комментарии:

1. Это не будет компилироваться. В вашем классе ServerStart нет вызываемого сигнала serverStartedSig , но вы пытаетесь подключить его к чему-то.

2. И зачем вообще нитки — просто потому, что это круто? Здесь абсолютно нет необходимости в двух потоках…

3. даже когда я добавляю signals: void serverStartedSig(); , что это не работает, я думаю, что класс сервера должен быть производным от класса QObject. мне абсолютно нужны потоки в моей программе, это поток отправителя пакетов, который ищет пакеты, которые нужно отправить, и отправляет их один за другим. я хочу иметь возможность что-то делать с потоком запуска сервера, который находится в while цикле, пока поток отправителя пакетов отправляет пакеты.

4. я добавил все, но ничего не происходит

5. я слышал, как ютубер говорил о том, чтобы в некоторых случаях дважды испускать сигнал. нужно ли мне тоже это делать? излучение сигнала от server.cpp чтобы serverstart.cpp затем снова отправляю его с serverstart.cpp чтобы mainwindow.cpp