hur.cn - 华软网

 热门搜索

opc读一次数据,内存就会增加4k,郁闷中...

  作者:未知    来源:网络    更新时间:2011/9/19
建立客户端的时候。
首先建立一个server
添加group
最后添加items
然后read数据。
采用的同步读写方式,但是每读一次数据,内存就会上涨4K
C++">if(b_enable)
    {
        hRet=pOPCSync->Read(OPC_DS_CACHE,2,hServerAI,&pItemValue,&pErrors);
        if(hRet!=S_OK) 
        {
            KillTimer(2);
            MessageBox("通信失败");
        }
        CoTaskMemFree(pErrors);
        m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
        m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);
        //m_nPlcSystemTimeSecond=V_R4(&pItemValue[1].vDataValue);
        m_LABEL1.Format("%d",m_bStartEnd);
        UpdateData(false);
    }

if(b_enable)
    {
        hRet=pOPCSync->Read(OPC_DS_CACHE,2,hServerAI,&pItemValue,&pErrors);
        if(hRet!=S_OK) 
        {
            KillTimer(2);
            MessageBox("通信失败");
        }
        CoTaskMemFree(pErrors);
        m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
        m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);
        //m_nPlcSystemTimeSecond=V_R4(&pItemValue[1].vDataValue);
        m_LABEL1.Format("%d",m_bStartEnd);
        UpdateData(false);
    }


---华软 网友回答---
顶起来,没人能解决?
---华软网友回复---
没有释放资源,内存增加很正常
---华软网友回复---
读完用完要释放啊。
---华软网友回复---
引用 3 楼 chinatcp 的回复:
读完用完要释放啊。

我的后半程序就是来释放资源的,怎么会不行呢?怎么及时释放?
---华软网友回复---
引用 2 楼 echoyin59 的回复:
没有释放资源,内存增加很正常
我的后半程序就是来释放资源的,怎么会不行呢?怎么及时释放?
---华软网友回复---
你这是客户端还是服务端啊?应该是客户端吧?
---华软网友回复---
引用 6 楼 nrxtgcb 的回复:
你这是客户端还是服务端啊?应该是客户端吧?

嗯,看出什么问题了吗?我得问题现在还灭解决
---华软网友回复---
引用 2 楼 echoyin59 的回复:
没有释放资源,内存增加很正常

其实我是释放了,只是刚发现上面的帖子粘贴错误
C++">	if(b_enable)
{
pOPCItemMgt->RemoveItems(2,hServerAI,&pErrors);
pOPCItemMgt->RemoveItems(2,hServerAO,&pErrors);
pServer->RemoveGroup(hOPCServerGroup,TRUE);
pOPCSync->Release();
pOPCItemMgt->Release();
pServer->Release();
ppUnknown->Release();
}

---华软网友回复---
m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);

这两项赋值也是需要内存啊。
程序运行总是需要内存的,主要看看是否有泄漏。
---华软网友回复---
引用 9 楼 chinatcp 的回复:
m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);

这两项赋值也是需要内存啊。
程序运行总是需要内存的,主要看看是否有泄漏。
求高手详解,怎么具体查泄露?
---华软网友回复---
OPC 没人解决?
---华软网友回复---
pItemValue
检查一下如何释放这个
---华软网友回复---
引用 12 楼 luciferstar 的回复:
pItemValue
检查一下如何释放这个

为什么要考虑这个参数呢?不是只要把接口指针释放掉就可以了吗?
---华软网友回复---
用什么来驱动的?循环还是timer?

---华软网友回复---
引用 14 楼 jennyvenus 的回复:
用什么来驱动的?循环还是timer?
timer
---华软网友回复---
引用 14 楼 jennyvenus 的回复:
用什么来驱动的?循环还是timer?

经过几次变换释放接口对象的位置,现在稍微有所改善,但是还是会涨,我不太明白的是这个内存一点不涨才算正常吗?程序如下OnTimer
C++">	hRet=pOPCSync->Read(OPC_DS_CACHE,2,hServerAI,&pItemValue,&pErrors);
if(hRet!=S_OK) 
{
KillTimer(1);
MessageBox("通信失败");
}
m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);
m_LABEL1.Format("%d",m_bStartEnd);
CoTaskMemFree(pErrors);
CoTaskMemFree(pItemValue);
UpdateData(false);

---华软网友回复---
引用 12 楼 luciferstar 的回复:
pItemValue
检查一下如何释放这个

	hRet=pOPCSync->Read(OPC_DS_CACHE,2,hServerAI,&pItemValue,&pErrors);
if(hRet!=S_OK) 
{
KillTimer(1);
MessageBox("通信失败");
}
m_bStartEnd=V_BOOL(&pItemValue[0].vDataValue);
m_bTongPhoto=V_BOOL(&pItemValue[1].vDataValue);
m_LABEL1.Format("%d",m_bStartEnd);
CoTaskMemFree(pErrors);
CoTaskMemFree(pItemValue);
UpdateData(false);

这样操作之后,内存增长变缓,昨晚测试10个小时基本涨了176K,相对之前12M小多了,但是还在涨,不知道是不是还有哪里需要释放?难道是增加组,增加项这一块吗?
---华软网友回复---
看了你的问题,我也挺纠结的!!!
---华软网友回复---
timer就会这样,时间一长系统都会变慢。

---华软网友回复---
引用 19 楼 jennyvenus 的回复:
timer就会这样,时间一长系统都会变慢。

经过一段时间的测试,我发现程序只是在最初的时候增长,一定时间后就不在涨了,是不是算是正常?
---华软网友回复---
引用 12 楼 luciferstar 的回复:
pItemValue
检查一下如何释放这个

应该是这里的问题,现在我将此变量释放之后,确实增幅拉大,整体上涨变小,可是为什么还是有稍微的增量呢?
---华软网友回复---
现在还出现一个问题,不知道推测对不对,这个程序一直这么运行着,一直没涨,但是我把界面运行到最前方,却涨了,就是我对界面什么也没做,只是让它运行到最前方,这是怎么回事
---华软网友回复---
去掉timer应该会好,俺用线程和timer试过,查询数据库,timer越来越慢。

---华软网友回复---
如果还是持续小幅度增长,则还是有某个分配的指针没有被释放掉。这个只能一点一点自己看代码排查了。
引用 21 楼 guoln1010 的回复:
引用 12 楼 luciferstar 的回复:
pItemValue
检查一下如何释放这个

应该是这里的问题,现在我将此变量释放之后,确实增幅拉大,整体上涨变小,可是为什么还是有稍微的增量呢?
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。