2015-04-28 18 views
6

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(); 
} 
+1

PS: ho provato il collegamento diretto. <--- cosa intendi con questo? – Greenflow

+0

Mi dispiace, voglio dire la connessione: connect (questo, SIGNAL (disconnectFromOven()), connectionThread, SLOT (stop()), Qt :: DirectConnection); – Bremen

+1

E questo è il problema. Basta rimuovere Qt :: DirectConnection. Problema risolto. – Greenflow

risposta

0

QThread (connectionThread) istanza vive nel thread che istanziato esso (thread principale), non nel thread che chiama run(), quindi se si desidera chiamare slot è necessario utilizzare il primo approccio presentato nel documentazione here, osservare l'approccio oggetto-lavoro .

+1

E propongo inoltre questa documentazione: http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html – Greenflow

+0

Ciao, ho aggiunto questo-> moveToThread (connectionThread); dopo l'allocazione del puntatore, ma anche questo non ha risolto il mio problema: /. L'ho fatto correttamente? – Bremen

+0

@Greenflow grazie, questa è una bella informazione. – Zlatomir