1

で動作するクライアントをセットアップしていますQTcpSocket。サーバーへの接続を設定する部分をスレッドとして実装します。

これは、接続関数 (.hpp) を実装する私のクラスの外観です。

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;
};

そして、これが私がこのクラス (.cpp) を実装した方法です。

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);

誰かがこれを解決する方法を知っていれば、素晴らしいでしょう、ありがとう:)

4

1 に答える 1

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();
}
于 2013-07-06T18:06:33.053 に答える