[英]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.