首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在C++中传递已更改的变量

仅在C++中传递已更改的变量
EN

Stack Overflow用户
提问于 2012-04-07 17:40:55
回答 1查看 156关注 0票数 0

我需要一些帮助来让我的代码更有效率。代码行做了我想做的事情,但是做得很糟糕。我需要它更有效,因为我稍后将增加数据量,然后函数将太慢。

我也是一个新手C++和编程,所以欢迎任何建议,以便我可以学习更多。

由于大多数时候只有很少的更改,所以我只希望函数A中更改的值由函数B进一步发送。现在,在我的代码中,每个值都被进一步发送,即使根本没有更改。我知道这是对资源的浪费,也不是好的编程。

重要信息!1) IOCP.sendVarData的第一个参数的值是静态的,不能更改。2)函数B中的结果("MCP_annunFD",& PmdgGetVariable )发起一切。改善这一点的最好方法是什么?

我有下面的函数,它检测自上次运行以来的任何更改,并存储更改。

// NGX数据发生变化时调用此函数,ProcessNGXData (PMDG_NGX_Data *pS) {

代码语言:javascript
复制
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 ;}
}

在另一个线程中,我现在有了这个函数来发送

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2012-04-07 19:07:14

首先要做几件事:

没有人想知道你同时拥有NGX_MCP_annunCMD_ANGX_MCP_annunCMD_B。我们感兴趣的是一个说明问题的小样本代码,最好使用尽可能少的特定于域的信息。如果它真的编译成功了,那就太棒了。

有两件事你没有提到,但你应该提出来:

float...)?

  • Since
  1. PMDG_NGX_Data PODs的所有成员(int、float、持有int的结构、您提到的线程,PMDG_NGX_Data的所有成员都是独立的,还是需要锁定机制?

关于您的第一个函数ProcessNGXData

如果PMDG_NGX_Data的所有成员都是PODs,并且它处理结构的所有成员,那么它等同于更短的,也许更快的:

代码语言:javascript
复制
PMDG_NGX_Data NGX_MCP_bakup;
void ProcessNGXData (PMDG_NGX_Data *pS) 
{
    NGX_MCP_bakup = *pS;
}

作为原始问题的解决方案,您可以尝试执行以下操作:

  • 在基本PMDG_NGX_Data上创建一个包装器类,这将负责跟踪getters包装器通过getters和setters暴露底层结构的字段。
  • 设置器检测正在设置的值是否与当前值不同,如果不是,则更改值并将其添加到更改列表( ID和新值对的列表)。
  • 包装器类还具有接受IOCP对象的方法。为更改列表中的每个ID和值调用sendVarData并清除更改列表。

确保添加了必要的锁定,并处理在调用"send change function“之间多次更改相同参数的情况。

就像所有的优化一样:“你确定这是必要的吗?”和“确保测试并看到它实际上工作得更好。”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10053384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档