0

コードをより効率的にするために助けが必要です。コードラインは私が望むことをしますが、うまくいきません。後でデータの量を増やし、関数が遅すぎるため、より効率的にする必要があります。

私も C++ とプログラミングの初心者なので、どんな提案も歓迎されているので、もっと学ぶことができます。

ほとんどの場合、変更はほとんどないため、関数 A で変更された値を関数 B によってさらに送信したいだけです。コードでは、まったく変更されていない場合でも、すべての値がさらに送信されます。これはリソースの浪費であり、適切なプログラミングではありません。

重要!1) IOCP.sendVarData の最初のパラメーターの値は静的であり、変更できません。2) 関数 B の PmdgGetVariable ("MCP_annunFD", &result) がすべてを開始します。これを改善する最善の方法は何でしょうか?

前回の実行時からの変更を検出し、変更を保存する以下の機能があります。

// この関数は、NGX データが変更されたときに呼び出されます void ProcessNGXData (PMDG_NGX_Data *pS) {

if (pS->MCP_Course[0]   != NGX_MCP_Course[0]){NGX_MCP_Course[0] = pS->MCP_Course[0];}
if (pS->MCP_Course[1]   != NGX_MCP_Course[1]){NGX_MCP_Course[1] = pS->MCP_Course[1];}
if (pS->MCP_IASMach     != NGX_MCP_IASMach){NGX_MCP_IASMach     = pS->MCP_IASMach;}
if (pS->MCP_Heading     != NGX_MCP_Heading){NGX_MCP_Heading     = pS->MCP_Heading;} 
if (pS->MCP_Altitude    != NGX_MCP_Altitude){NGX_MCP_Altitude   = pS->MCP_Altitude;}
if (pS->MCP_VertSpeed   != NGX_MCP_VertSpeed){NGX_MCP_VertSpeed = pS->MCP_VertSpeed;}

if (pS->MCP_annunLVL_CHG != NGX_MCP_annunLVL_CHG){NGX_MCP_annunLVL_CHG = pS->MCP_annunLVL_CHG;}


if (pS->MCP_annunN1         != NGX_MCP_annunN1)     {NGX_MCP_annunN1 =      pS->MCP_annunN1;}
if (pS->MCP_annunSPEED      != NGX_MCP_annunSPEED)  {NGX_MCP_annunSPEED =   pS->MCP_annunSPEED;}
if (pS->MCP_annunVNAV       != NGX_MCP_annunVNAV)   {NGX_MCP_annunVNAV =    pS->MCP_annunVNAV;}
if (pS->MCP_annunLVL_CHG    != NGX_MCP_annunLVL_CHG){NGX_MCP_annunLVL_CHG = pS->MCP_annunLVL_CHG;}
if (pS->MCP_annunHDG_SEL    != NGX_MCP_annunHDG_SEL){NGX_MCP_annunHDG_SEL = pS->MCP_annunHDG_SEL;}
if (pS->MCP_annunLNAV       != NGX_MCP_annunLNAV)   {NGX_MCP_annunLNAV =    pS->MCP_annunLNAV;}
if (pS->MCP_annunVOR_LOC    != NGX_MCP_annunVOR_LOC){NGX_MCP_annunVOR_LOC = pS->MCP_annunVOR_LOC ;}
if (pS->MCP_annunAPP        != NGX_MCP_annunAPP )   {NGX_MCP_annunAPP  =    pS->MCP_annunAPP ;}
if (pS->MCP_annunALT_HOLD   != NGX_MCP_annunALT_HOLD){NGX_MCP_annunALT_HOLD = pS->MCP_annunALT_HOLD ;}
if (pS->MCP_annunVS         != NGX_MCP_annunVS )    {NGX_MCP_annunVS  =      pS->MCP_annunVS ;}
if (pS->MCP_annunCMD_A      != NGX_MCP_annunCMD_A ) {NGX_MCP_annunCMD_A  =  pS->MCP_annunCMD_A ;}
if (pS->MCP_annunCWS_A      != NGX_MCP_annunCWS_A ) {NGX_MCP_annunCWS_A  =  pS->MCP_annunCWS_A ;}
if (pS->MCP_annunCMD_B      != NGX_MCP_annunCMD_B ) {NGX_MCP_annunCMD_B  =  pS->MCP_annunCMD_B ;}
if (pS->MCP_annunCWS_B      != NGX_MCP_annunCWS_B)  {NGX_MCP_annunCWS_B  =  pS->MCP_annunCWS_B ;}
}

別のスレッドでは、この関数を送信するようになりました

static UINT running_as_Thread(LPVOID lpvoid) {
            int  result;
            bool rep= true;
            while (rep){
            PmdgGetVariable ("MCP_annunFD", &result);       
            IOCP.sendVarData ( 2534, NGX_MCP_Course [0]);
            IOCP.sendVarData ( 2524,  NGX_MCP_Altitude);
            IOCP.sendVarData ( 2542, NGX_MCP_Heading);
            IOCP.sendVarData ( 2559, NGX_MCP_IASMach);
            IOCP.sendVarData ( 1140, NGX_MCP_VertSpeed);
            IOCP.sendVarData ( 2535, NGX_MCP_Course [1]);   
            IOCP.sendVarData ( 286, NGX_MCP_annunLVL_CHG);  
            IOCP.sendVarData ( 1143, NGX_MCP_VertSpeedBlank);   
            IOCP.sendVarData ( 1115, NGX_MCP_IASBlank); 
            IOCP.sendVarData ( 1117 , NGX_MCP_IASOverspeedFlash);       
            IOCP.sendVarData ( 1118, NGX_MCP_IASUnderspeedFlash);           
            IOCP.sendVarData ( 282, NGX_MCP_annunATArm);
            IOCP.sendVarData ( 283, NGX_MCP_annunN1);
            IOCP.sendVarData ( 284, NGX_MCP_annunSPEED);
            IOCP.sendVarData ( 285, NGX_MCP_annunVNAV);
            IOCP.sendVarData ( 286, NGX_MCP_annunLVL_CHG);
            IOCP.sendVarData ( 287, NGX_MCP_annunHDG_SEL);
            IOCP.sendVarData ( 288, NGX_MCP_annunLNAV);
            IOCP.sendVarData ( 289, NGX_MCP_annunVOR_LOC);
            IOCP.sendVarData ( 290, NGX_MCP_annunAPP);
            IOCP.sendVarData ( 291, NGX_MCP_annunALT_HOLD);
            IOCP.sendVarData ( 292, NGX_MCP_annunVS);
            IOCP.sendVarData ( 293, NGX_MCP_annunCMD_A);
            IOCP.sendVarData ( 294, NGX_MCP_annunCWS_A);
            IOCP.sendVarData ( 295, NGX_MCP_annunCMD_B);    
            IOCP.sendVarData ( 296, NGX_MCP_annunCWS_B);
Sleep (400);
}
    return THREAD_EXIT_OK;
}
4

1 に答える 1

0

最初にいくつかのこと:

NGX_MCP_annunCMD_Aあなたが aと a の両方を持っていることを誰も知りたくありませんNGX_MCP_annunCMD_B。問題を説明するコードの小さなサンプルに関心があります。できれば、ドメイン固有の情報をできるだけ少なくしてください。実際にコンパイルできれば、それは素晴らしいことです。

あなたが言及しなかったが、持つべき2つのこと:

  1. PMDG_NGX_Data PODのすべてのメンバー(int、float、int を保持する構造体、float...) はありますか?

  2. あなたがスレッドに言及したので、すべてのメンバーはPMDG_NGX_Data独立していますか、それともロック機構が必要ですか?

あなたの最初の機能についてProcessNGXData

のすべてのメンバーPMDG_NGX_Dataが POD であり、構造体のすべてのメンバーを処理する場合、より短く、おそらくより高速であると同等です。

PMDG_NGX_Data NGX_MCP_bakup;
void ProcessNGXData (PMDG_NGX_Data *pS) 
{
    NGX_MCP_bakup = *pS;
}

元の問題の解決策として、これを試すことができます:

  • basic の上にラッパー クラスを作成しますPMDG_NGX_Data。これは、変更の追跡を担当します。
  • このラッパーは、ゲッターとセッターを介して基礎となる構造のフィールドを公開します。
  • セッターは、設定されている値が現在のものと異なるかどうかを検出し、異なる場合は値を変更し、変更のリスト (ID と新しい値のペアのリスト) に追加します。
  • ラッパー クラスには、IOCPオブジェクトを受け取り、sendVarData変更リスト内の各 ID と値を呼び出し、変更リストをクリアするメソッドもあります。

必要なロックを追加し、「send changes 関数」の呼び出しの間に同じパラメーターが複数回変更された場合を処理するようにしてください。

すべての最適化と同様に、「本当に必要ですか?」「必ずテストして、実際にうまく機能することを確認してください。」

于 2012-04-07T11:07:14.157 に答える