Ho cercato SO per questa domanda, ma erano un po 'diversi dai miei. Il mio problema è che non voglio ricevere un segnale da un altro thread, ma voglio mandarne uno. Ricezione funziona nella mia app, ma quando provo a inviare, sto ricevendo un errore che sto cercando di inviare ad un altro thread ... Non so come risolvere questo problema. Questa è la mia situazione: Ho un'applicazione Gui. Nella classe MainWindow creo un oggetto myThread, che è ereditato da Qthread. Quindi avvio il nuovo thread. In MainWindow esiste un segnale e in myThread esiste uno slot (questo codice viene eseguito nella finestra principale). Quando provo a fare:Qt invia segnale a thread diversi
connect(this, SIGNAL(disconnect(),
connectionThread, SLOT(stop()));
arresto() è una scanalatura in filo di connessione e disconnessione() è un segnale da MainWindow. Quando il segnale viene emesso, ottengo:
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.
C'è un modo per superare questo? Devo essere in grado di inviare e ricevere eventi tramite segnali e slot da e verso il thread che ho creato. Mi piacerebbe davvero tutto l'aiuto!
PS: Ho provato il collegamento diretto.
connect(this, SIGNAL(disconnectFromOven()),
connectionThread, SLOT(stop()), Qt::DirectConnection);
Questo è il codice: 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: ho provato il collegamento diretto. <--- cosa intendi con questo? – Greenflow
Mi dispiace, voglio dire la connessione: connect (questo, SIGNAL (disconnectFromOven()), connectionThread, SLOT (stop()), Qt :: DirectConnection); – Bremen
E questo è il problema. Basta rimuovere Qt :: DirectConnection. Problema risolto. – Greenflow