我需要一些帮助来让我的代码更有效率。代码行做了我想做的事情,但是做得很糟糕。我需要它更有效,因为我稍后将增加数据量,然后函数将太慢。
我也是一个新手C++和编程,所以欢迎任何建议,以便我可以学习更多。
由于大多数时候只有很少的更改,所以我只希望函数A中更改的值由函数B进一步发送。现在,在我的代码中,每个值都被进一步发送,即使根本没有更改。我知道这是对资源的浪费,也不是好的编程。
重要信息!1) IOCP.sendVarData的第一个参数的值是静态的,不能更改。2)函数B中的结果("MCP_annunFD",& PmdgGetVariable )发起一切。改善这一点的最好方法是什么?
我有下面的函数,它检测自上次运行以来的任何更改,并存储更改。
// NGX数据发生变化时调用此函数,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;
}发布于 2012-04-07 19:07:14
首先要做几件事:
没有人想知道你同时拥有NGX_MCP_annunCMD_A和NGX_MCP_annunCMD_B。我们感兴趣的是一个说明问题的小样本代码,最好使用尽可能少的特定于域的信息。如果它真的编译成功了,那就太棒了。
有两件事你没有提到,但你应该提出来:
float...)?
PMDG_NGX_Data PODs的所有成员(int、float、持有int的结构、您提到的线程,PMDG_NGX_Data的所有成员都是独立的,还是需要锁定机制?关于您的第一个函数ProcessNGXData:
如果PMDG_NGX_Data的所有成员都是PODs,并且它处理结构的所有成员,那么它等同于更短的,也许更快的:
PMDG_NGX_Data NGX_MCP_bakup;
void ProcessNGXData (PMDG_NGX_Data *pS)
{
NGX_MCP_bakup = *pS;
}作为原始问题的解决方案,您可以尝试执行以下操作:
PMDG_NGX_Data上创建一个包装器类,这将负责跟踪getters包装器通过getters和setters暴露底层结构的字段。IOCP对象的方法。为更改列表中的每个ID和值调用sendVarData并清除更改列表。确保添加了必要的锁定,并处理在调用"send change function“之间多次更改相同参数的情况。
就像所有的优化一样:“你确定这是必要的吗?”和“确保测试并看到它实际上工作得更好。”
https://stackoverflow.com/questions/10053384
复制相似问题