0

この質問について誰かが提案してください..?QEvent から派生したクラスを使用して、TX スレッドからメインウィンドウにデータを送信する必要があります。

データが受信されるたびに RX スレッドがイベントをスローするようにして、そのデータをメインウィンドウに表示できるようにします。

ボタンの開始が押されると、メインスレッドを開始します。メインスレッドのオブジェクト内のメインウィンドウへのポインターを保存します。このポインターを使用して、イベントを mainwindow オブジェクトに投稿します。

初めて Qthread 関数 dowork_rx() に入るとき。イベントがスローされ、customEvent() ハンドラーでキャッチできます。しかし、イベントをスローしたときに dowork_rx() while ループが開始すると、customEvent() 関数はトリガーされません。

この問題を解決する方法を提案してください。

私のqeventクラス:---

//String event derived class
template <typename T> class StringEvent : public QEvent
{
   QString m_str;
public:
   explicit StringEvent(const QString val) : QEvent(staticType()), m_str(val)
   {
   }

   void setvalue(QString val)
   {
       m_str = val;
   }

   QString value() const
   {
       return m_str;
   }

   static QEvent::Type staticType()
   {
      static int type = QEvent::registerEventType();
      return static_cast<QEvent::Type>(type);

      /*
        static int type;
      if(type == 0)
      {
          type = QEvent::registerEventType();
      }

         return static_cast<QEvent::Type>(type);*/
   }

   static bool is(const QEvent * ev)
   {
       return ev->type() == staticType();
   }
};

class UpdateEvent : public StringEvent<UpdateEvent>
{
public:
    explicit UpdateEvent(QString val): StringEvent(val)
    {
       //qDebug() << "hello";

    }

};


class ClearEvent  : public StringEvent<ClearEvent>
{
public:
    explicit ClearEvent(QString val): StringEvent(val)
    {

    }
};

スレッドの Dowork 関数 :----

// Common slot for the rx - thread
void RxThreadObject::dowork_rx()
{
    int i =0;
    qDebug() << "\nrx start \n";

    myUpdateEvent_rx = new UpdateEvent("UpdateEventObject - dowork_rx");
    //myUpdateEvent_rx->setvalue("first");
    QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
    qDebug() << "\nrx throw event - done \n";

    while(!m_bQuitRx)
    {

        SleepTimerDelay::sleep(2);

        if(i==0){
            //qDebug() << "\nrx throw event - done  11 \n";
            myUpdateEvent_rx = new UpdateEvent("first");
            myUpdateEvent_rx->setvalue("first");
            QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
            i++;
        }else{
            //qDebug() << "\nrx throw event - done  22 \n";
            myUpdateEvent_rx = new UpdateEvent("second");
            myUpdateEvent_rx->setvalue("second");
            QCoreApplication::postEvent(m_pMainThreadObj->ptrmainwindow, myUpdateEvent_rx);
            i=0;
        }


    }

    qDebug() << "\nrx end \n";

}

イベントハンドラ:----

/*!
** Custom event handler
*/
void MainWindow::customEvent(QEvent *event)
{
    qDebug() << "oo customEvent";
   if (UpdateEvent::is(event)) {
       UpdateEvent *tempUpdateEvent = static_cast<UpdateEvent *>(event);
       qDebug() << tempUpdateEvent->value();

   }
   else if (ClearEvent::is(event)) {
       ClearEvent *tempClearEvent = static_cast<ClearEvent *>(event);
       qDebug() << tempClearEvent->value();

   }

}

/*!
** event filter handler
*/
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    qDebug() << "oo  eventFilter";
   if (UpdateEvent::is(event)) {
       UpdateEvent *tempUpdateEvent = static_cast<UpdateEvent *>(event);
       qDebug() << tempUpdateEvent->value();

   }
   else if (ClearEvent::is(event)) {
       ClearEvent *tempClearEvent = static_cast<ClearEvent *>(event);
       qDebug() << tempClearEvent->value();

   }

   return true;

}
4

0 に答える 0