0

次の Thread.cpp があります。

   while (1) 
    {
       rplidar_response_measurement_node_t nodes[8192];
       size_t   count = _countof(nodes);

       op_result = drv->grabScanData(nodes, count);

       if (IS_OK(op_result)) 
        {
           drv->ascendScanData(nodes, count);

           for (int pos = 0; pos < (int)count ; ++pos) 
            {

               nodes[pos].sync_quality & RPLIDAR_RESP_MEASUREMENT_SYNCBIT;
               nodes[pos].angle_q6_checkbit >> RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT/64.0f;
               nodes[pos].distance_q2/4.0f;
               nodes[pos].sync_quality >> RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT;
            }
        }
    }
  return ;
}

モーションスレッド.cpp

void Motion::Synchronization(QString motiontype)
{
      if(motiontype == START)
       {

   if(269<Thread::angle_q6_checkbit && Thread::angle_q6_checkbit <271)
    {
        if(Thread::distance_q2>1200)
        {
            dist_left=1200;
        }
     else
      {
           dist_left=Thread::distance_q2;
      }
                cout<<"Motion +Stuff+="<< endl;
    }
  }
}

これは私の正確なコードではありません。これは、データを取得して変数にデータを格納する部分です。distance_q2, angle_q6_checkbitなどはアトミック変数ではないため、別のスレッドからの読み取りと書き込みは一貫していません!! 同じスレッドで、データを印刷しようとすると、適切な読み取りが得られます。出力を以下に示します。

Thread.cpp からの適切なデータ

今、私は処理または他の私のもののためにデータを取得しようとしました. 距離、角度の品質データを保存するThread::sync_quality, Thread::angle_q6_checkbit, Thread::distance

レーザー データThread.cppからmotion.cppスレッドへのデータの取得 (モーション スレッドでのデータのカウント):

cout << "distance "<< Thread::distance_q2 << endl;
cout << "angle "<< Thread::angle_q6_checkbit << endl;
cout << "quality level "<< int(Thread::sync_qualitylevel) << endl;

不適切な出力が得られます (359 度しか得られず、これも不適切です)。結論が出ません。上記の出力は次のようになります。

別スレッドmotion.cooで不適切なデータ

その後、アトミックとして宣言しようとしましたが、改善が見られません。助けていただければ幸いです。

4

0 に答える 0