Question

I have a Thread class thats derives from QThread:

class Thread :
    public QThread
{
    Q_OBJECT
public:
    Thread(QObject* parent = NULL);
    ~Thread(void);

    virtual void run();
    void stop();

public slots:
    virtual void OnMessage(const char* msg);

protected:
    bool m_Done;
};

And a derived class:

class DerivedThread: public Thread
{
    Q_OBJECT
public:
    virtual void run();

    ~DerivedThread();

public slots:
    virtual void OnMessage(const char* msg);

private:
    IQFeedSocket* m_Socket;
};

This is pretty straight forward. Then I have a Socket wrapper class that takes a Thread object in its constructor:

class IQFeedSocket : public QObject
{
    Q_OBJECT

public:
    IQFeedSocket(Thread *parent);
    ~IQFeedSocket();

    bool Connect(int port);
    bool Write(const char* msg);

public slots:
    void OnMessage();

signals:
    void SendMessage(const char* msg);

private:
    QTcpSocket* m_Socket;
    char* m_ReceiveBuffer;
};

Now, I do call exec() in my DerivedThread::run() method, and it is successful because I get the OnMessage() call in the socket object, which is instantiated within the thread. What I want to do is pretty simple: In the IQFeedSocket::OnMessage, I will check that the message receive is completed (it has to end in "\r\n") and when a complete message is received, forward it to my Thread object that is registered in the constructor. So, in my IQFeedSocket constructor, I do this:

IQFeedSocket::IQFeedSocket(Thread *parent)
    : QObject(parent)
{
    m_ReceiveBuffer = new char();
    connect(this,SIGNAL(SendMessage(const char*)), this->parent(), SLOT(OnMessage(const char*)));
}

And in the OnMessage() method:

void IQFeedSocket::OnMessage()
{
    const char* msg;
    if(m_Socket->bytesAvailable() != 0) //More stuff needed
    {
        QByteArray msgArray = m_Socket->readAll();
        msg = msgArray;
        emit SendMessage(msg);
    }
}

When I debug, I get to the emit line, but then the OnMessage(char*) method from the DerivedThread object is never called. I'm sure it's a pretty simple oversee, but I can't seem to spot where I'm going wrong. Any Ideas? thx!

The DerivedThread::OnMessage(char*):

void DerivedThread::OnMessage(const char* msg)
{
        //This never gets called :(
    printf(msg);
    char* f;
    strcpy(f,msg);
}

EDIT: I have also tried the connect() on the DerivedThread side:

m_Socket = new IQFeedSocket(this);
connect(m_Socket, SIGNAL(SendMessage(const char*)), this, SLOT(OnMessage(const char*)));
Thread::exec();

But with no luck.

Was it helpful?

Solution

The arguments in the signal/slot definition and the connect call have to match EXACTLY including const.

Even using a typedef in one and the full name in the other is enough to break it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top