запускаемый проект находится здесь: введите описание ссылки здесь
Я искренне рад получить ваши подробные ответы, чтобы решить эту проблему, но я все еще путаюсь по этому вопросу:
case 1: изменение socket_session
в качестве переменной-члена mainwindow
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
SocketThread* socket_session;
private:
...
Но это не решение для доступа к setFlag
, даже после того, как я изменил `Form1 :: on_qpushButton__set_white_level_0_clicked ( ) 'функция выглядит следующим образом:
void Form1::on_qpushButton__set_white_level_0_clicked() {
qDebug() <<"clicked()";
socket_session->setThreadFlag(true);
}
Тем не менее, это не имеет смысла, поскольку экземпляр form1
не имеет "экземпляра" socket_thread
, который был создан из mainwindow
. Я думаю, что есть решение создать другой класс, который включает все экземпляры, которые я хочу использовать из mainwindow
, но я не думаю, что это хороший вариант, потому что я использую поток и обращаюсь к глобальному большому классу экземпляров, который включает в себя все для них «делиться» не очень хорошая идея для таких, как я.
#include <form1.h>
#include <ui_form1.h>
#include "socketthread.h"
Form1::Form1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form1) {
ui->setupUi(this);
}
Form1::~Form1() {
delete ui;
}
void Form1::on_qpushButton__set_white_level_0_clicked() {
qDebug() <<"clicked()";
socket_session->setThreadFlag(true);
}
введите описание изображения здесь
Я знаю, что не понимаю это, но я хочу сделать что-то, что никто не делает ...? Я думаю, что каждый хочет четко отделить все объекты и их методы и общаться через сигналы или вызывающие функции от экземпляров доставленных объектов ...
case 2: ... позвольте мне попробовать, как вы предложили, сделать возможным сначала ...
Я могу читать код C ++ и общую структуру, но я не знаю, почему мне нужно с этим бороться, поэтому, пожалуйста, помогите мне, дорогой Гуру.
На socketthread.h :
class SocketThread : public QThread {
Q_OBJECT
public:
QTcpSocket *socket_session;
SocketThread();
~SocketThread(){}
bool connectToServer(QString, int);
void sendData(const char*, int, int);
void run(void);
private:
QString message;
volatile bool threadFlag;
signals:
void changedThreadFlag(void);
void changedMessageStr(void);
void setThreadFlag(bool);
void setMessageStr(QString);
private slots:
void setStr(QString);
void setFlag(bool);
void socketError(QAbstractSocket::SocketError);
};
И его реализация ...
SocketThread::SocketThread() {
socket_session = NULL;
threadFlag = false;
message = "NULL";
connect(this, SIGNAL(setThreadFlag(bool)), this, SLOT(setFlag(bool)));
}
...
void SocketThread::setStr(QString str) {
message = str;
}
void SocketThread::setFlag(bool flag) {
threadFlag = flag;
}
void SocketThread::run() {
while(true) {
if(threadFlag) {
QThread::msleep(100);
qDebug() << message;
} else
break;
}
qDebug() << "loop ended";
}
И у меня есть одна форма, в которой есть кнопка, и я вставил в нее щелчок (), как это .. .
void Form1::on_qpushButton__set_white_level_0_clicked() {
qDebug() <<"clicked()";
--how can I emit the signal of the one of socketthread from here??
}
Теперь главное окно выглядит так:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
QString addr_server = "223.194.32.106";
int port = 11000;
SocketThread* socket_session = new SocketThread();
socket_session->connectToServer(addr_server, port);
ui->setupUi(this);
Form1* form1;
form1 = new Form1();
ui->stackedWidget_mainwindow->addWidget(form1);
ui->stackedWidget_mainwindow->setCurrentWidget(form1);
socket_session->run();
...
Я просто хочу испустить сигнал setThreadFlag сокета thread изнутри слота QPushbutton_clicked (). Как только socket_session->run()
запустился, мне нужно изменить threadFlag
, нажав кнопку, выбрасывая setThreadFlag()
одного из запущенного потока. И я просто застрял здесь.
Возможно ли даже? Или я делаю все это неправильно с самого начала?