程序中要启动很多的线程
我怎么知道被我启动的线程的运行状况?1.
这个线程也许需要运行较长时间,但我怎么知道它是在正常的运行还是进入了死循环?
2.
这个线程可能会申请空间但不释放,我又怎么知道这种情况?
3.
这个线程可能会动态加载DLL,但是这个被加载的DLL可能会引发异常,从而引起主进程的崩溃
又怎么处理这种情况?熟悉线程的朋友请指教,谢谢!
我怎么知道被我启动的线程的运行状况?1.
这个线程也许需要运行较长时间,但我怎么知道它是在正常的运行还是进入了死循环?
2.
这个线程可能会申请空间但不释放,我又怎么知道这种情况?
3.
这个线程可能会动态加载DLL,但是这个被加载的DLL可能会引发异常,从而引起主进程的崩溃
又怎么处理这种情况?熟悉线程的朋友请指教,谢谢!
第二个问题可以在调试阶段解决,用BoundsChecker跑一趟差不多就可以保证没有memory leak了。
第三个问题恐怕得用seh去解决。
将线程中的情况写
log文件,也可以.要么sendMessage到主程序,然后显示信息在界面上.
2.程序执行完后,看有没有内存泄漏
信息量少时用调试输出语句好了TRACE ,OutputDebugString等
将线程中的情况写
log文件,也可以.要么sendMessage到主程序,然后显示信息在界面上
--------------
进入了死循环怎么返回?
第二个问题可以在调试阶段解决,用BoundsChecker跑一趟差不多就可以保证没有memory leak了。
第三个问题恐怕得用seh去解决。
------------------------
心跳?
BoundsChecker?
seh?
能否详细点?
2。使用工具检测
3。在代码中处理异常
--------------------因为出异常的在我调的DLL中的函数里
我怎么在我的代码里面处理这种异常?我程序中启动的线程就是为了加载DLL,然后调其中的函数
DLL可能写的不好,会引发异常,但是DLL的编写者并没有处理我是调用者,我如何在我的代码中处理这种异常
DLL可能写的不好,会引发异常,但是DLL的编写者并没有处理我是调用者,我如何在我的代码中处理这种异常如果DLL中的函数的执行是在你的线程函数中的话,那么只需要在线程函数中try/catch就行了,
如果中间涉及其它线程(比如DLL中也创建了线程等),只能处理未处理异常了,但结果还是一个,那就是程序异常终止,但可以在终止前取得异常有关的详细信息。
如果中间涉及其它线程(比如DLL中也创建了线程等),只能处理未处理异常了,但结果还是一个,那就是程序异常终止,但可以在终止前取得异常有关的详细信息。
-------------------------
我的线程函数就是调用我自定义类的一个对象的方法
UINT MyThreadFun(LPVOID pParam)
{
CT01Dlg *pDlg = (CT01Dlg *)pParam;
pDlg->MyObject.LoadMytask();//MyObject是MyClass的一个对象
return 0;
}
LoadMytask这个函数就是加载一个DLL然后调用DLL中的某个方法
void MyClass::LoadMytask()
{
HINSTANCE my = LoadLibrary(m_dllpath);
if (my==NULL)
{
return;
}
FARPROC pfn = GetProcAddress(my,"MyDllFun");
if (pfn==NULL)
{
return;
}
pfn();
}
如果在DLL中的MyDllFun函数有未处理的异常,如果我调用方不处理会导致程序崩溃就是这个问题
可以直接在线程函数中用try/catch?问题是我都不知道是什么异常啊
###########################################################################
如果
MyDllFun中有无穷循环
我调用方又如何知道?如果
MyDllFun
申请内存
不释放
我调用方又如何知道?
###########################################################################
###########################################################################
BoundsChecker是一个辅助工具,主要用于检查Memory Leak和Object leak,其余包括API参数校验之类的功能。
SEH是结构化异常处理的简称,SEH和C++的异常处理不是一回事,SEH是Windows提供的,C++的异常处理是语言的一个特征,由编译器确保实现。
------------------------
正好手头有本书<<windows核心编程>>有一章讲这个,研究下,谢谢!
__try
__finally
codewarrior(会思考的草)
---------------
请问
无法在要求对象展开的函数中使用 __try
是什么意思?我这样用无法通过编译
UINT StartDll2(LPVOID pParam)
{
CT01Dlg *pDlg = (CT01Dlg *)pParam;
HINSTANCE my = LoadLibrary(pDlg->DllPath);
if (my==NULL)
{
return (-1);
}
FARPROC pfn = GetProcAddress(my,"MyDllFun2");
if (pfn==NULL)
{
return (-1);
}
__try{
pfn();
}
__finally{
AfxMessageBox("SEH");
return (-1);
}
return 0;
}
pfn()是我需要调用的Dll中的函数
它里面会引起异常,但这个函数本身并没有处理
比如里面有越界访问的错误
如果我启了这个线程就会造成我程序的崩溃
---------------
请问
无法在要求对象展开的函数中使用 __try
是什么意思?我这样用无法通过编译
UINT StartDll2(LPVOID pParam)
{
CT01Dlg *pDlg = (CT01Dlg *)pParam;
HINSTANCE my = LoadLibrary(pDlg->DllPath);
if (my==NULL)
{
return (-1);
}
FARPROC pfn = GetProcAddress(my,"MyDllFun2");
if (pfn==NULL)
{
return (-1);
}
__try{
pfn();
}
__finally{
AfxMessageBox("SEH");
return (-1);
}
return 0;
}**********************************************************************
**********************************************************************
找到了答案
原因:函数中涉及到C++对象就导致C++异常和SEH同时在一个函数中存在,导致冲突,无法通过编译
修改为下
UINT StartDll2(LPVOID pParam)
{
//CT01Dlg *pDlg = (CT01Dlg *)pParam;
HINSTANCE my = LoadLibrary("Dll的路径");
if (my==NULL)
{
return (-1);
}
FARPROC pfn = GetProcAddress(my,"MyDllFun2");
if (pfn==NULL)
{
return (-1);
}
__try{
pfn();
}
__finally{
AfxMessageBox("SEH");
return (-1);
}
return 0;
}
就可以通过编译了
运行
测试发现
执行到
pfn();
同样引发异常,导致程序崩溃,如果
pfn()函数不是Dll中的函数,比如就是一个全局函数
SEH就可以起作用,不会让调用的程序崩溃
对于DLL中的函数会引发的异常,调用方如何防止程序崩溃
应该怎么才可以实现
**********************************************************************
**********************************************************************
**********************************************************************UINT StartDll2(LPVOID pParam)
{
HINSTANCE my = LoadLibrary("Dll的路径");//一个写的DLL,里面的函数会引发异常,
//调用这个函数
if (my==NULL)
{
return (-1);
}
FARPROC pfn = GetProcAddress(my,"MyDllFun2");
if (pfn==NULL)
{
return (-1);
}
__try{
pfn();
}
__finally{
AfxMessageBox("SEH");
return (-1);
}
return 0;
}
执行到
pfn();
同样引发异常,导致程序崩溃,对于DLL中的函数会引发的异常//这个函数本身没有处理异常
调用方如何防止程序崩溃
应该怎么才可以实现
**********************************************************************
**********************************************************************
-----------------------
你是说
对于DLL中的函数会引发的异常//这个函数本身没有处理异常
调用方如何防止程序崩溃
这种情况无法处理?