#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