Qt посылает сигнал в другой поток

Я искал так для этого вопрос, но они немного отличаются от моих. Моя проблема в том, что я не хочу получать сигнал из другого потока, но я хочу его отправить. Получение работает в моем приложении, но при попытке отправки я получаю ошибку, которую я пытаюсь отправить в другой поток... Я не знаю, как это исправить. Это моя ситуация: У меня есть приложение Gui. В классе MainWindow я создаю объект myThread, который наследуется от Qthread. Затем я запускаю новый поток. В MainWindow сигнал существует, и в myThread существует слот (этот код запускается в главном окне). Когда я пытаюсь сделать:

connect(this, SIGNAL(disconnect(),
        connectionThread, SLOT(stop()));

stop () - это слот в резьбе соединения, а disconnect () - сигнал от главного окна. Когда сигнал испущен, я получаю:

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 128f8250. Receiver '' (of type 'QNativeSocketEngine') was created in thread 14bae218", file kernelqcoreapplication.cpp, line 521
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

есть ли способ преодолеть это? Мне нужно иметь возможность отправлять и получать события через сигналы и слоты в поток, который я создал. Я бы очень aprichiate всем помочь!

PS: Я пробовал directlinking.

connect(this, SIGNAL(disconnectFromOven()),
            connectionThread, SLOT(stop()), Qt::DirectConnection);

этот код: Файл MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void moveUndoView();

signals:
    void disconnectFromOven();

};

#endif // MAINWINDOW_H

файл MainWindow.cpp:

#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initComponents();

    QString ip = "10.10.10.17";
    int port = 5432;
    connectionThread = new TcpThread(ip, port, connectAndStay);

    show();

    // tcp connection
    connect(connectionThread, SIGNAL(connectionEstablished()),
            this, SLOT(on_connectionEstablished()));

    connect(connectionThread, SIGNAL(connectionNotEstablished()),
                this, SLOT(on_connectionNotEstablished()));

    connect(this, SIGNAL(disconnectFromOven()),
            connectionThread, SLOT(stop()));


}


void MainWindow::on_action_Disconnect_triggered()
{
    emit disconnectFromOven();
}

tcpthread.h:

#ifndef TCPTHREAD_H
#define TCPTHREAD_H

#include <QThread>
#include <QDebug>

#include "tcpconnection.h"

class TcpThread : public QThread
{
    Q_OBJECT
public:
    explicit TcpThread(QString& address,
                       int& port, conType_t conType, QObject *parent = 0);
    void run(); // inherited


signals:
    void connectionStatusOk();
    void connectionEstablished();
    void connectionNotEstablished();

private slots:
    void stop();
    void connectionClosed();
    void connectionOpened();
    void connectionOpenFailed();

};

#endif // TCPTHREAD_H

tcpthread.cpp:

#include "tcpthread.h"

TcpThread::TcpThread(QString& address,
                     int& port, conType_t conType, QObject *parent) :
    QThread(parent)
{
    this->address = address;
    this->port = port;
    this->conTypeRequested = conType;
}

void TcpThread::stop()
{
    qDebug() << "Thread stop called, requesting disconnect";
    tcpCon->doDisconnect();
}

1 ответов


экземпляр QThread (connectionThread) живет в потоке, который его создал (основной поток), а не в потоке, который вызывает run (), поэтому, если вы хотите вызвать слоты, вам нужно использовать первый подход, представленный в документации здесь, посмотри рабочий-объектный подход.