Category Hierarchy

我正在使用VS2010和Qt 5.5.1在Windows7上使用QLocalSocket和QLocalServer进行进程间通信。

在向另一个进程发送超过256条消息后,CIPSocket中的析构函数冻结。我将这个问题追溯到qtbase\src\corelib\ioqwinoverlappedionotifier.cpp中的一个信号槽问题,在这个问题中,notify(双字numberOfBytes,双字errorCode,重叠*重叠)中发出的信号_q_notify()不会导致调用_q_notified()。因此,信号量hSemaphore超过了它的最大计数,导致析构函数中的死锁。

信号槽不工作的原因可能是什么?我找不到任何断开或阻塞信号。

提前谢谢。

main.cpp:

#include "main.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <iostream>

int main(int argc, char *argv[])
{
    printf("Server (0) or Socket (1)?\n");
    char c = getchar();
    if (c == '0') {
        QCoreApplication app(argc, argv);
        CIPServer server;
        app.exec();
    }
    else if (c == '1') {
        CIPSocket socket;
        for (unsigned int i = 0; i <= 256; ++i) {
            socket.update(i);
            QThread::msleep(10);
        }
    }
}

/*--------------------------------------------------------------------------
   CIPSocket
----------------------------------------------------------------------------*/
CIPSocket::CIPSocket()
: m_bIsReady(false)
{
    m_pSocket = new QLocalSocket(this);
    m_stream.setDevice(m_pSocket);

    connect(m_pSocket, SIGNAL(connected()), this, SLOT(connectionReady()));
    connect(m_pSocket, SIGNAL(disconnected()), this, SLOT(connectionLost()));

    m_pSocket->connectToServer("DemoServer");
}

CIPSocket::~CIPSocket()
{
    delete m_pSocket;
    m_pSocket = NULL;
}

void CIPSocket::update(int i)
{
    if (m_bIsReady)
        m_stream << i;
}

void CIPSocket::connectionReady()
{ m_bIsReady = true; }

void CIPSocket::connectionLost()
{ m_bIsReady = false; }

/*--------------------------------------------------------------------------
   CIPServer
----------------------------------------------------------------------------*/
CIPServer::CIPServer(QObject* parent)
: QLocalServer(parent)
{
    if (!listen("DemoServer")) {
        throw ("Could not connect to 'DemoServer'");
    }
    connect(this, SIGNAL(newConnection()), this, SLOT(socketConnected()));
}

CIPServer::~CIPServer()
{}

void CIPServer::socketConnected()
{
    qDebug() << "Connected";
    m_pConnection = nextPendingConnection();
    m_stream.setDevice(m_pConnection);
    connect(m_pConnection, SIGNAL(disconnected()), m_pConnection, SLOT(deleteLater()));
    connect(m_pConnection, SIGNAL(readyRead()), this, SLOT(update()));
}

void CIPServer::update()
{
    if (m_pConnection->bytesAvailable() >= 4) {
        int i;
        m_stream >> i;
        qDebug() << i;
    }
}

main.h:

#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#include <QtCore/QDataStream>
#include <QtCore/QThread>


    /// \brief Creates a socket for inter-process communication
    class CIPSocket
        : public QObject
    {
        Q_OBJECT;

    public:
        /// Constructor
        CIPSocket();
        /// Destructor
        virtual ~CIPSocket();

        /// Send the data
        void update(int i);

    public slots:
        /// Enables updating
        void connectionReady();
        /// Disables updating
        void connectionLost();

    private:
        /// The target stream
        QDataStream m_stream;
        /// The socket connecting to server
        QLocalSocket* m_pSocket;
        /// Indicates if the socket is connected
        bool m_bIsReady;
    };

    /// \brief Creates a server for inter-process communication
    class CIPServer
        : public QLocalServer
    {
        Q_OBJECT;

    public:
        /// Constructor
        CIPServer(QObject* parent = NULL);
        /// Destructor
        virtual ~CIPServer();
        /// Starts the server
        void start();

    private slots:
        /// Connects the socket to the stream and to the update function
        void socketConnected();
        /// Reads the data from the stream and emits a the results
        void update();

    private:
        /// The currently connected socket
        QLocalSocket* m_pConnection;
        /// The incoming stream
        QDataStream m_stream;
    };

demo.pro:

CONFIG += qt debug
QT += network
HEADERS += main.h
SOURCES += main.cpp
CONFIG += console

转载请注明出处:http://www.yojatech.com/article/20230526/1407025.html