网页调用ActiveX,在同一窗口中切换时会死掉,cpu占50%

时间:2022-06-05 21:02:16
网页调用ActiveX,在同一窗口中切换时会死掉,cpu占50%。 在新窗口中调用没有问题。


如果用本机上的ActiveX控件也没有问题。


谁知道原因啊。

30 个解决方案

#1


用一窗口切换?
没明白

#2


发个可以复现问题的环境给我,我可以帮你调一下
gw_net@163.com

#3


引用 1 楼 zoulie 的回复:
用一窗口切换?
没明白


就是在同一进程中打开网页。  

如果 “右键->在新窗口中打开链接”就没有问题。

#4


这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。

#5


是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是  同一进程 多次实例化。  cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。

#6


引用 4 楼 aa3000 的回复:
这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。


切换网页的时候也要用到相同的ActiveX

#7


引用 5 楼 rendao0563 的回复:
是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是同一进程 多次实例化。  cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。


是不自己写的。感觉程序也不怎么复杂。 也没用到线程。

你的意思是:当切换的时候 对象没有 释放掉,是吗?

#8


是我自己写的。  cpu也确实是双核的

#9


在同进程多次实例化COM对象。那么你提供的COM对象之间的数据是应该分离的。
举例:
伪码如下

class CPlayer
{
//do something
};

class COM
{
public:
static CPlayer m_oPlayer;
};

当COM被同进程实例化两次

COM com1;
COM com2;
他们之间将会共享m_oPlayer

简单的来说就是让你的COM对象的数据独立。不能因为实例化多次。他们之间数据产生冲突。明白了吗?

#10


我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来

#11


引用 10 楼 sndaxdrs 的回复:
我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来


1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。

#12


引用 11 楼 rendao0563 的回复:
引用 10 楼 sndaxdrs 的回复:
我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来


1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。


1.  切换网页的时候 对象不是自动析构的吗? 难道有什么办法控制他不析构吗?或者是我想错了。切换网页时对象本来是不析构的?  如果切换网页时析构了再切换回来的话可以再加载啊,这个没有什么问题的
2.   以你的想法,如果不声明为static的话》?是不是还会出现问题?
3.   我下午再告诉你
4.   谢谢你的帮助。

#13


看明白我的意思。重点不是static ->  是你的多个COM对象之间是否有数据共享。如果他们共享一些数据是会出问题的。

#14


知道了。刚才理解错了。

刷新页面不会有问题。

我的程序结构是这样的。在 ActiveX控件中添加一个类。 用于画图。 在控件里声明另一个类的对象为成员函数。

    每当有数据的话就控件就调用这个类的成员函数画图。 不知道这样算不算共享。

#15



HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}



把这2个代码贴出来。

#16


我的 ActiveX控件里没这两个控件啊

#17


我的 ActiveX控件里没这两个函数啊

#18


我是用MFC写的ActiveX控件

#19


初始化和回头资源的地方。

#20


回收资源。

#21


CCurveChartCtrl::CCurveChartCtrl()
{
InitializeIIDs(&IID_DCurveChart, &IID_DCurveChartEvents);

if (!g_pSysLog)
{
g_pSysLog = new CSysLog();
g_pSysLog->Init("c:\\chartlog","curve");
}

// TODO: 在此初始化控件的实例数据。
g_pSysLog->AppendLog(LOG_DEBUG,"CCurveChartCtrl");

m_bInitChart = FALSE;
m_bCreateChart = FALSE;
m_bInitData = FALSE;
m_IntervalBase = 2;
m_szSoapEndPoint[0] = 0;
m_nTypeFlag = 0;
m_GetDataCallback.GetData = OnDataLoad;
m_GetDataCallback.param = (unsigned long)this;
m_plotMinTime = CTime::GetCurrentTime();//7.22
m_timeSpan = 0;
m_bCreateThread = FALSE;

m_Plot.m_testType = 0;

bIsLoaded = false;
}

CCurveChartCtrl::~CCurveChartCtrl()
{


}

#22


把全局数据全部成员化。
当CCurveChartCtrl被第二次实例的时候。第二次实例会把你前面申请的冲掉。并且跨线程访问。网页一般都是线程池调度的。并且你两个实例同时写一个文件也会有问题。你最好把log文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。

#23


问题解决。在这里要 非常感谢 rendao0563 , 确实是如你所说,我把定义的 全局对象 “ CSysLog* g_pSysLog = NULL;”注释掉就解决了。我根本 就没有写日志。 所以 这个全局对象是可有可无的。

    没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。

    我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。

    csdn里高人真多啊。而且都很热情。感谢CSDN。

    
 

#24


先把分给了。再开个贴多加点分。我再给你解释。 网页调用ActiveX,在同一窗口中切换时会死掉,cpu占50%

#25


问题点数:40分

楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(

#26


rendao0563呢?

#27


发一份能运行调试的代码给我,我看看,iamhycljc@163.com

#28


引用 27 楼 iamhycljc 的回复:
发一份能运行调试的代码给我,我看看,iamhycljc@163.com


谢谢。问题已经解决了。只是不知道深层次原因在哪里

#29


rendao0563呢?

#30


rendao0563

#1


用一窗口切换?
没明白

#2


发个可以复现问题的环境给我,我可以帮你调一下
gw_net@163.com

#3


引用 1 楼 zoulie 的回复:
用一窗口切换?
没明白


就是在同一进程中打开网页。  

如果 “右键->在新窗口中打开链接”就没有问题。

#4


这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。

#5


是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是  同一进程 多次实例化。  cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。

#6


引用 4 楼 aa3000 的回复:
这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。


切换网页的时候也要用到相同的ActiveX

#7


引用 5 楼 rendao0563 的回复:
是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是同一进程 多次实例化。  cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。


是不自己写的。感觉程序也不怎么复杂。 也没用到线程。

你的意思是:当切换的时候 对象没有 释放掉,是吗?

#8


是我自己写的。  cpu也确实是双核的

#9


在同进程多次实例化COM对象。那么你提供的COM对象之间的数据是应该分离的。
举例:
伪码如下

class CPlayer
{
//do something
};

class COM
{
public:
static CPlayer m_oPlayer;
};

当COM被同进程实例化两次

COM com1;
COM com2;
他们之间将会共享m_oPlayer

简单的来说就是让你的COM对象的数据独立。不能因为实例化多次。他们之间数据产生冲突。明白了吗?

#10


我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来

#11


引用 10 楼 sndaxdrs 的回复:
我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来


1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。

#12


引用 11 楼 rendao0563 的回复:
引用 10 楼 sndaxdrs 的回复:
我没有完全懂,我有几个问题:

1. 当在同进程中切换网页时不会调用  析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来


1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。


1.  切换网页的时候 对象不是自动析构的吗? 难道有什么办法控制他不析构吗?或者是我想错了。切换网页时对象本来是不析构的?  如果切换网页时析构了再切换回来的话可以再加载啊,这个没有什么问题的
2.   以你的想法,如果不声明为static的话》?是不是还会出现问题?
3.   我下午再告诉你
4.   谢谢你的帮助。

#13


看明白我的意思。重点不是static ->  是你的多个COM对象之间是否有数据共享。如果他们共享一些数据是会出问题的。

#14


知道了。刚才理解错了。

刷新页面不会有问题。

我的程序结构是这样的。在 ActiveX控件中添加一个类。 用于画图。 在控件里声明另一个类的对象为成员函数。

    每当有数据的话就控件就调用这个类的成员函数画图。 不知道这样算不算共享。

#15



HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}



把这2个代码贴出来。

#16


我的 ActiveX控件里没这两个控件啊

#17


我的 ActiveX控件里没这两个函数啊

#18


我是用MFC写的ActiveX控件

#19


初始化和回头资源的地方。

#20


回收资源。

#21


CCurveChartCtrl::CCurveChartCtrl()
{
InitializeIIDs(&IID_DCurveChart, &IID_DCurveChartEvents);

if (!g_pSysLog)
{
g_pSysLog = new CSysLog();
g_pSysLog->Init("c:\\chartlog","curve");
}

// TODO: 在此初始化控件的实例数据。
g_pSysLog->AppendLog(LOG_DEBUG,"CCurveChartCtrl");

m_bInitChart = FALSE;
m_bCreateChart = FALSE;
m_bInitData = FALSE;
m_IntervalBase = 2;
m_szSoapEndPoint[0] = 0;
m_nTypeFlag = 0;
m_GetDataCallback.GetData = OnDataLoad;
m_GetDataCallback.param = (unsigned long)this;
m_plotMinTime = CTime::GetCurrentTime();//7.22
m_timeSpan = 0;
m_bCreateThread = FALSE;

m_Plot.m_testType = 0;

bIsLoaded = false;
}

CCurveChartCtrl::~CCurveChartCtrl()
{


}

#22


把全局数据全部成员化。
当CCurveChartCtrl被第二次实例的时候。第二次实例会把你前面申请的冲掉。并且跨线程访问。网页一般都是线程池调度的。并且你两个实例同时写一个文件也会有问题。你最好把log文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。

#23


问题解决。在这里要 非常感谢 rendao0563 , 确实是如你所说,我把定义的 全局对象 “ CSysLog* g_pSysLog = NULL;”注释掉就解决了。我根本 就没有写日志。 所以 这个全局对象是可有可无的。

    没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。

    我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。

    csdn里高人真多啊。而且都很热情。感谢CSDN。

    
 

#24


先把分给了。再开个贴多加点分。我再给你解释。 网页调用ActiveX,在同一窗口中切换时会死掉,cpu占50%

#25


问题点数:40分

楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(

#26


rendao0563呢?

#27


发一份能运行调试的代码给我,我看看,iamhycljc@163.com

#28


引用 27 楼 iamhycljc 的回复:
发一份能运行调试的代码给我,我看看,iamhycljc@163.com


谢谢。问题已经解决了。只是不知道深层次原因在哪里

#29


rendao0563呢?

#30


rendao0563