Я настраиваю клиента, работающего с QTcpSocket. Сторона, в которой установлено соединение с сервером, должна быть реализована как поток.C++/Qt - Сигнал из одного потока в другой раздел нитей
Это как мой класс выглядит, который реализует функции подключения (ГЭС):
class Connector: public QObject {
Q_OBJECT
public:
Connector(QString hexHost);
virtual ~Connector();
// Start to establish a connection
void startConnection();
// End thread
void stopConnection();
signals:
// Emitted, if connector should get to work
void startTransforming();
// Emitted, if transformation from hex to dig is complete
void transformationFinished();
// Emitted, if connection is established
void connectionEstd();
// Emitted, if connection failed
void connectionFailed();
// Emitted, if work is done
void doneConnecting();
public slots:
// Connect to server
void connectToServer();
private:
// IP of the server
QString addressHost;
// Socket
QTcpSocket aQTcpSocket;
};
И это, как я реализовал этот класс (СРР);
Connector::Connector(QString hexHost)
{
// Save user data
addressHost = hexHost;
// Start thread
bool result = QObject::connect(this, SIGNAL(startTransforming()), this, SLOT(transformIP()));
Q_ASSERT(result);
// Start trying to establish a connection
result = QObject::connect(this, SIGNAL(transformationFinished()), this, SLOT(connectToServer()));
Q_ASSERT(result);
// End thread
result = QObject::connect(this, SIGNAL(doneConnecting()), this, SLOT(deleteLater()));
Q_ASSERT(result);
Q_UNUSED(result);
}
Connector::~Connector()
{
QObject::disconnect(this, SIGNAL(startTransforming()), this, SLOT(transformIP()));
QObject::disconnect(this, SIGNAL(transformationFinished()), this, SLOT(connectToServer()));
QObject::disconnect(this, SIGNAL(doneConnecting()), this, SLOT(deleteLater()));
}
void Connector::transformIP()
{
[...]
// Emit ready signal
emit transformationFinished();
}
void Connector::connectToServer()
{
aQTcpSocket.connectToHost(addressHost, port);
result = aQTcpSocket.waitForConnected(5000);
if(result)
{
emit connectionFailed();
emit doneConnecting();
std::clog << "Connection failed!" << std::endl; // This debug message is printed during runtime
return;
}
// Emit signal
emit connectionEstd();
}
void Connector::startConnection()
{
emit startTransforming();
}
void Connector::stopConnection()
{
emit doneConnecting();
}
Я начинаю нить по:
[...]
// Create new thread
QThread *conThread = new QThread();
// Create connector object
aConnector = new Connector(hexHost);
aConnector->moveToThread(conThread);
conThread->start();
// Clean up thread
bool result = QObject::connect(aConnector, SIGNAL(destroyed()), conThread, SLOT(quit()));
Q_ASSERT(result);
result = QObject::connect(conThread, SIGNAL(finished()), conThread, SLOT(deleteLater()));
Q_ASSERT(result);
// Connect signals
result = QObject::connect(aConnector, SIGNAL(connectionFailed()), this, SLOT(onConnectionFailed()));
Q_ASSERT(result);
result = QObject::connect(aConnector, SIGNAL(connectionEstd()), this, SLOT(onConnectionEstd()));
Q_ASSERT(result);
Q_UNUSED(result);
// Get connector to work
aConnector->startConnection();
[...]
Когда я протестировать программу, разъем создан правильно. Он запускает функцию transformIP() и connectToServer(). В настоящее время у меня нет сервера, поэтому клиент не может подключиться. Это должно привести к испусканию сигнала connectionFailed() Класс клиента, который запускает поток с объектом соединителя, должен получать этот сигнал и реагировать на него.
Проблема заключается в следующем: Сигнал, похоже, не испускается, поскольку класс клиента не реагирует на него. Вот часть в клиентском классе, где я подключить сигнал к определенному слот:
// Connect signals
result = QObject::connect(aConnector, SIGNAL(connectionFailed()), this, SLOT(onConnectionFailed()));
Q_ASSERT(result);
было бы здорово, если бы кто-то имел представление о том, как решить эту проблему, спасибо :)
Спасибо за ваши быстрая реакция! Я изменил свой код, как вы предлагали, но он, похоже, не работал. Я увеличил значение CONNECT_TIME_OUT, но ничего не произошло, сигнал все еще не испускается. –
Что в вашем onConnectionFailed()? – stepanbujnak
Он просто испускает другой сигнал, с которым работает другой класс. В основном это говорит: emit anotherSignal(); –