我写了一个执行工作对象的线程。一切正常。结果信号也按应有的方式发出。当然,我处理了有关线程/对象关联性的常见错误。
今天我为这些工作线程/线程编写了一个自动化模块测试。我创建了一个 QSignalSpy 来等待工作对象(已移动到线程)发出的信号,如下所示:
QSignalSpy spy(worker, SIGNAL(Success()));
thread.ExecuteWorker();
QVERIFY(spy.wait()); // Error in this line
Run Code Online (Sandbox Code Playgroud)
我在标记行中收到一个众所周知的错误:
QObject::killTimer: timers cannot be stopped from another thread
Run Code Online (Sandbox Code Playgroud)
首先,我预计会出现错误,因为 wait() 中的某些代码在错误的线程中执行。然后我在QSignalSpy的实现中发现了如下代码:
if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, Qt::DirectConnection, 0))
{
qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect.");
return;
}
Run Code Online (Sandbox Code Playgroud)
这显然意味着 QSignalSpy 一直使用 DirectConnection 并且不能用于监视生活在不同线程中的对象的信号。
为什么他们在 Qt5.3 中这样编程?这是一个错误还是有意的行为?我该如何解决这个限制?
我目前正在为我的一个课程编写一些单元测试。然而,我很快就遇到了一个问题。似乎 QSignalSpy 有时无法捕捉到disconnected()我的Client班级发出的信号。这是我的单元测试:
void ClientTest::test_disconnectFromHost()
{
QTcpServer server;
server.listen(QHostAddress::Any, 65000);
QTcpSocket* clientSocket = new QTcpSocket();
QSignalSpy connectedSpy(clientSocket, SIGNAL(connected()));
clientSocket->connectToHost(QHostAddress::Any, 65000);
if (!connectedSpy.wait()) {
QFAIL("Client socket connection failed.");
}
Chat::Client client(clientSocket);
QSignalSpy disconnectedSpy(clientSocket, SIGNAL(disconnected()));
// Return true if disconnection succeded
QVERIFY(client.disconnectFromHost());
QVERIFY(disconnectedSpy.wait(500)); // RETURNS FALSE!
// Return false if client was not connected
QVERIFY(!client.disconnectFromHost());
QCOMPARE(client.getLastError(),
Chat::Client::Error::NotConnected);
clientSocket->connectToHost(QHostAddress::Any, 65000);
if (!connectedSpy.wait()) {
QFAIL("Client socket connection failed.");
}
QTcpSocket* serverSocket = server.nextPendingConnection();
serverSocket->disconnectFromHost(); // RETURNS FALSE!
// Emit disconnected …Run Code Online (Sandbox Code Playgroud)