Qt-send-signal zum anderen thread

Den ich gesucht habe ALSO für diese Frage, aber Sie waren ein bisschen anders als meine. Mein problem ist, dass ich nicht wollen, um ein signal zu erhalten aus einem anderen thread, aber ich möchte zu senden. Empfang funktioniert in meiner app, aber beim Versuch zu senden, erhalte ich die Fehlermeldung, dass ich versuche zu senden, um einen anderen thread... ich weiß nicht, wie man dieses Problem beheben.
Dies ist meine situation:
Ich habe eine Gui-Anwendung. In der MainWindow-Klasse erstelle ich ein Objekt myThread, das ist geerbt von Qthread.
Ich starten Sie dann den neuen thread. Im MainWindow ein signal vorhanden ist und in myThread ein slot vorhanden ist (dieser code wird im Hauptfenster). Wenn ich versuche zu tun:

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

stop() ist ein slot-in-Anschluss-Gewinde und disconnect() wird ein signal von MainWindow. Wenn das signal emited, bekomme ich:

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 kernel\qcoreapplication.cpp, line 521
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

Gibt es eine Möglichkeit dies zu überwinden? Ich muss in der Lage sein zu senden und empfangen-Ereignisse durch Signale und slots zu und von den thread habe ich erstellt. Ich Würde wirklich aprichiate alle Hilfe!

PS: ich habe versucht, directlinking.

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

Dies ist der code:
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();
}
  • PS: ich habe versucht, directlinking. <--- was meinst du mit, dass?
  • Sorry, ich bedeutet verbinden: connect(this, SIGNAL(disconnectFromOven()), connectionThread, SLOT stop (), Qt::DirectConnection);
  • Und das ist das problem. Entfernen Sie einfach Ihre Qt::DirectConnection. Das Problem ist gelöst.
  • Dies löste mein problem, wenn ein signal EMPFANGEN von connectionThread. Umgekehrt funktioniert nicht.
  • Natürlich funktioniert es. Oder Sie haben irgendein anderes problem. Das senden und empfangen signal/slots zwischen threads ist wahrscheinlich eines der am häufigsten verwendeten thread-Techniken in Qt.
  • Nun, ich weiß nicht, was es sein könnte. Nur Empfang bei mir funktioniert. Ich bin immer der angegebene Fehler beim senden der erstellten thread. Es sagt, dass ich nicht senden Ereignis zum anderen thread.
  • Vielleicht zeigen Sie ein bisschen mehr code?
  • es gibt eine Klammer fehlt bei deiner ersten code-Beispiel. Tippfehler?
  • Versuchen Sie, geben Qt::QueuedConnection explizit, vielleicht das empfangende Objekt ist noch in der main thread bei der Verbindung, so dass AutoConnection geben wird DirectConnection, ich bin mir nicht sicher, ob explizite pass von QueuedConnection löst dieses problem. Trotzdem poste mehr code.
  • Ich habe den code aus diesem Mechanismus, ich Schnitt einige davon, die unrevelant und Schattierung. Ich habe versucht Qt::QueuedConnection wie gut, funktioniert nicht.

InformationsquelleAutor Bremen | 2015-04-28
Schreibe einen Kommentar