簡體   English   中英

如何使用Qt和C ++的“接口類”通信兩個線程

[英]How communicate two thread, using a “Interface Class” with Qt and C++

我正在使用Qt,並且嘗試在其他線程中的事件ocorr(pjsip庫收到調用)時從主線程(導航至其他選項卡)調用方法。

我制作了一個類,使用您的名字叫“ SipHandlerController”的接口。 我在主類中擴展了該類(在我的代碼中,來自Qt的mainwindow具有名稱Start)。

我的類在pjsip的線程中用於“接收呼叫”。 從pjsip到該事件的處理程序的類也具有“ SipHandlerController”類型的屬性,該屬性接收我的主類的實例(該類在其他線程中運行以操縱所有ui)。 當pjsip線程調用“接收呼叫”事件時,它實際上是從我的主線程調用該方法(實現SipHandlerController的方法),但收到一個錯誤,應用程序損壞了:

QCoreApplication :: sendEvent中的ASSERT失敗:“無法將事件發送到其他線程擁有的對象。當前線程0x0x26545658。在線程0x0x2071ab68中創建了接收方'pageDialer'(類型為'QWidget')”,文件kernel \\ qcoreapplication.cpp,行576

我的介面

#ifndef SIP_HANDLER_CONTROLLER_H
#define SIP_HANDLER_CONTROLLER_H

#include <pjsua2.hpp>

using namespace pj;

class SipHandlerController
{
public:
    virtual void onSipIncomingRinging(Call * call) = 0;
};

#endif // SIP_HANDLER_CONTROLLER_H

我在課堂上的實現從pjsip監聽事件

void SipLine::onIncomingCall(OnIncomingCallParam &iprm){
    SipCall *call = new SipCall(*this, iprm.callId);
    call->setHandler(this->handler);

    if(this->handler != nullptr){
        // Here is call the method from main thread
        this->handler->onSipIncomingRinging(call);
    }
}

我來自主類的頭(實現類“ SipHandlerController”,此類是我的主線程)。

class Start : public QMainWindow, public SearchHandler, public FooterHandler, public SipHandlerController, public PhonebookHandler
{
    Q_OBJECT

public:
    explicit Start(QWidget *parent = nullptr);
    ~Start();
    virtual void onSipIncomingRinging(Call * call);
}

我主要實現的源代碼是SipHandlerController。 (nav是QStackedWidget),調用了onSipIncomingRinging方法,但此時應用程序已損壞。

void  Start::onSipIncomingRinging(Call * call){
    this->call = call;
    ui->nav->setCurrentIndex(NavigationTabs::RINGING);
}

使用信號e發射得到解決:

添加了信號

class Start : public QMainWindow, public SearchHandler, public FooterHandler, public SipHandlerController, public PhonebookHandler
{
    Q_OBJECT
   public:
        explicit Start(QWidget *parent = nullptr);
        ~Start();
        virtual void onSipIncomingRinging(Call * call);
    signals:
        void onSipIncomingRingingEvent(Call * call);
}

實現更改為發出信號

void Start::onSipIncomingRinging(Call * call){
    emit onSipIncomingRingingEvent(call);
}

插槽更改前端

void Start::on_Start_onSipOutgoingRingingEvent(Call * call)
{
    this->call = call;
    ui->nav->setCurrentIndex(NavigationTabs::CONTACT);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM