2015-04-28 2 views
6

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

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

стоп() слот в соединительной резьбе и разъединить() является сигналом от MainWindow. Когда сигнал испускается, я получаю:

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. 

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

PS: Я пробовал прямую ссылку.

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

PS: Я пробовал прямую ссылку. <--- что вы имеете в виду? – Greenflow

+0

Извините, я имею в виду подключение: connect (это, СИГНАЛ (disconnectFromOven()), connectionThread, SLOT (stop()), Qt :: DirectConnection); – Bremen

+1

И в этом проблема. Просто удалите Qt :: DirectConnection. Задача решена. – Greenflow

ответ

0

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

+1

И я предлагаю дополнительно эту документацию: http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html – Greenflow

+0

Привет, я добавил это-> moveToThread (connectionThread); после выделения указателя, но это также не решило мою проблему: /. Я сделал это правильно? – Bremen

+0

@ Greenflow спасибо, это хорошая информация. – Zlatomir

Смежные вопросы