2013-07-06 5 views
1

Я настраиваю клиента, работающего с 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); 

было бы здорово, если бы кто-то имел представление о том, как решить эту проблему, спасибо :)

ответ

0

Это выглядит как возвращаемое значение QTcpSocket.connectToHost недействительно, а вызов является асинхронным. Что вам нужно сделать, это вызвать QTcpSocket.connectToHost() и ждать соединения, чтобы закончить с помощью QTcpSocket.waitForConnected (CONNECT_TIME_OUT) и есть еще справиться с плохим соединением

Пример:

QTcpSocket socket; 
socket.connectToHost(QHostAddress("172.0.0.1", 8080); 
if (!socket.waitForConnected(5000)) { 
    emit connectionFailed(); 
} 
+0

Спасибо за ваши быстрая реакция! Я изменил свой код, как вы предлагали, но он, похоже, не работал. Я увеличил значение CONNECT_TIME_OUT, но ничего не произошло, сигнал все еще не испускается. –

+0

Что в вашем onConnectionFailed()? – stepanbujnak

+0

Он просто испускает другой сигнал, с которым работает другой класс. В основном это говорит: emit anotherSignal(); –