如果用本机上的ActiveX控件也没有问题。
谁知道原因啊。
30 个解决方案
#1
用一窗口切换?
没明白
没明白
#2
发个可以复现问题的环境给我,我可以帮你调一下
gw_net@163.com
gw_net@163.com
#3
就是在同一进程中打开网页。
如果 “右键->在新窗口中打开链接”就没有问题。
#4
这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。
#5
是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是
同一进程 多次实例化。 cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。
#6
切换网页的时候也要用到相同的ActiveX
#7
是不自己写的。感觉程序也不怎么复杂。 也没用到线程。
你的意思是:当切换的时候 对象没有 释放掉,是吗?
#8
是我自己写的。 cpu也确实是双核的
#9
在同进程多次实例化COM对象。那么你提供的COM对象之间的数据是应该分离的。
举例:
伪码如下
class CPlayer
{
//do something
};
class COM
{
public:
static CPlayer m_oPlayer;
};
当COM被同进程实例化两次
COM com1;
COM com2;
他们之间将会共享m_oPlayer
简单的来说就是让你的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. 还有其它问题想不通。这里暂时提不出来
1. 当在同进程中切换网页时不会调用 析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来
#11
1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。
#12
1. 切换网页的时候 对象不是自动析构的吗? 难道有什么办法控制他不析构吗?或者是我想错了。切换网页时对象本来是不析构的? 如果切换网页时析构了再切换回来的话可以再加载啊,这个没有什么问题的
2. 以你的想法,如果不声明为static的话》?是不是还会出现问题?
3. 我下午再告诉你
4. 谢谢你的帮助。
#13
看明白我的意思。重点不是static ->
是你的多个COM对象之间是否有数据共享。如果他们共享一些数据是会出问题的。
#14
知道了。刚才理解错了。
刷新页面不会有问题。
我的程序结构是这样的。在 ActiveX控件中添加一个类。 用于画图。 在控件里声明另一个类的对象为成员函数。
每当有数据的话就控件就调用这个类的成员函数画图。 不知道这样算不算共享。
刷新页面不会有问题。
我的程序结构是这样的。在 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()
{
}
{
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文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。
当CCurveChartCtrl被第二次实例的时候。第二次实例会把你前面申请的冲掉。并且跨线程访问。网页一般都是线程池调度的。并且你两个实例同时写一个文件也会有问题。你最好把log文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。
#23
问题解决。在这里要 非常感谢 rendao0563 , 确实是如你所说,我把定义的 全局对象 “ CSysLog* g_pSysLog = NULL;”注释掉就解决了。我根本 就没有写日志。 所以 这个全局对象是可有可无的。
没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。
我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。
csdn里高人真多啊。而且都很热情。感谢CSDN。
没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。
我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。
csdn里高人真多啊。而且都很热情。感谢CSDN。
#24
先把分给了。再开个贴多加点分。我再给你解释。
#25
问题点数:40分
楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(
楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(
#26
rendao0563呢?
#27
发一份能运行调试的代码给我,我看看,iamhycljc@163.com
#28
谢谢。问题已经解决了。只是不知道深层次原因在哪里
#29
rendao0563呢?
#30
rendao0563
#1
用一窗口切换?
没明白
没明白
#2
发个可以复现问题的环境给我,我可以帮你调一下
gw_net@163.com
gw_net@163.com
#3
就是在同一进程中打开网页。
如果 “右键->在新窗口中打开链接”就没有问题。
#4
这个跟 ActiveX 卸载不当有关。当网页切换的时候,IE 会通知 ActiveX 进行卸载。
#5
是你自己写的还是? 如果是你自己写的。很多细节是需要注意的。你这个重点应该是
同一进程 多次实例化。 cpu占50%。应该是你的机器是双核的。如果单核估计百分百了。
#6
切换网页的时候也要用到相同的ActiveX
#7
是不自己写的。感觉程序也不怎么复杂。 也没用到线程。
你的意思是:当切换的时候 对象没有 释放掉,是吗?
#8
是我自己写的。 cpu也确实是双核的
#9
在同进程多次实例化COM对象。那么你提供的COM对象之间的数据是应该分离的。
举例:
伪码如下
class CPlayer
{
//do something
};
class COM
{
public:
static CPlayer m_oPlayer;
};
当COM被同进程实例化两次
COM com1;
COM com2;
他们之间将会共享m_oPlayer
简单的来说就是让你的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. 还有其它问题想不通。这里暂时提不出来
1. 当在同进程中切换网页时不会调用 析构函数把原来的对象析构吗?
2. 你给我的 代码 关键是不是在 static? 如果声明为static的话。 对象只被实例化一次?
3. 还有其它问题想不通。这里暂时提不出来
#11
1. 切换网页就把对象析构了。那对象保存的数据在我切换回来的时候如何恢复?
2. static 只是表面一个意思。只要是会共享的数据都会存在这样的问题。如果声明static的话。实际上他们是共用的。
3. 试试刷新页面你的组件能正常运行吗。
#12
1. 切换网页的时候 对象不是自动析构的吗? 难道有什么办法控制他不析构吗?或者是我想错了。切换网页时对象本来是不析构的? 如果切换网页时析构了再切换回来的话可以再加载啊,这个没有什么问题的
2. 以你的想法,如果不声明为static的话》?是不是还会出现问题?
3. 我下午再告诉你
4. 谢谢你的帮助。
#13
看明白我的意思。重点不是static ->
是你的多个COM对象之间是否有数据共享。如果他们共享一些数据是会出问题的。
#14
知道了。刚才理解错了。
刷新页面不会有问题。
我的程序结构是这样的。在 ActiveX控件中添加一个类。 用于画图。 在控件里声明另一个类的对象为成员函数。
每当有数据的话就控件就调用这个类的成员函数画图。 不知道这样算不算共享。
刷新页面不会有问题。
我的程序结构是这样的。在 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()
{
}
{
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文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。
当CCurveChartCtrl被第二次实例的时候。第二次实例会把你前面申请的冲掉。并且跨线程访问。网页一般都是线程池调度的。并且你两个实例同时写一个文件也会有问题。你最好把log文件名自动生成以下。这样每个实例操作自己的文件。不知道你听懂重点了没。其实还是前面说的。
#23
问题解决。在这里要 非常感谢 rendao0563 , 确实是如你所说,我把定义的 全局对象 “ CSysLog* g_pSysLog = NULL;”注释掉就解决了。我根本 就没有写日志。 所以 这个全局对象是可有可无的。
没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。
我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。
csdn里高人真多啊。而且都很热情。感谢CSDN。
没想到这一个小小的地方会导致 网页死掉,CPU占50%这么大的后果。这是我没有想到的。
我目前还不清楚导致这么严重后果的深层次原因在哪里。 希望rendao0563能再帮助解释一下。谢谢。
csdn里高人真多啊。而且都很热情。感谢CSDN。
#24
先把分给了。再开个贴多加点分。我再给你解释。
#25
问题点数:40分
楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(
楼上高人啊。我又给贴子加了20分,你就给我解释解释吧。求你了。呵呵。我也是穷人啊。不能给太多了。:(
#26
rendao0563呢?
#27
发一份能运行调试的代码给我,我看看,iamhycljc@163.com
#28
谢谢。问题已经解决了。只是不知道深层次原因在哪里
#29
rendao0563呢?
#30
rendao0563