程序中要启动很多的线程
我怎么知道被我启动的线程的运行状况?1.
这个线程也许需要运行较长时间,但我怎么知道它是在正常的运行还是进入了死循环?
2.
这个线程可能会申请空间但不释放,我又怎么知道这种情况?
3.
这个线程可能会动态加载DLL,但是这个被加载的DLL可能会引发异常,从而引起主进程的崩溃
又怎么处理这种情况?熟悉线程的朋友请指教,谢谢!

解决方案 »

  1.   

    好像不太好办,第一个可以隔一段时间要求线程发送一个心跳,主线程超时还没有收到就说明卡死了。
    第二个问题可以在调试阶段解决,用BoundsChecker跑一趟差不多就可以保证没有memory leak了。
    第三个问题恐怕得用seh去解决。
      

  2.   

    我的经验:根据返回值来确定.如果出错返回-1,正常返回0
    将线程中的情况写
    log文件,也可以.要么sendMessage到主程序,然后显示信息在界面上.
      

  3.   

    1.可以在线程结束时,发送MessageBox
    2.程序执行完后,看有没有内存泄漏
      

  4.   

    写文件最好
    信息量少时用调试输出语句好了TRACE ,OutputDebugString等
      

  5.   

    我的经验:根据返回值来确定.如果出错返回-1,正常返回0
    将线程中的情况写
    log文件,也可以.要么sendMessage到主程序,然后显示信息在界面上
    --------------
    进入了死循环怎么返回?
      

  6.   

    好像不太好办,第一个可以隔一段时间要求线程发送一个心跳,主线程超时还没有收到就说明卡死了。
    第二个问题可以在调试阶段解决,用BoundsChecker跑一趟差不多就可以保证没有memory leak了。
    第三个问题恐怕得用seh去解决。
    ------------------------
    心跳?
    BoundsChecker?
    seh?
    能否详细点?
      

  7.   

    1.用性能监视器监视线程的执行
    2。使用工具检测
    3。在代码中处理异常
    --------------------因为出异常的在我调的DLL中的函数里
    我怎么在我的代码里面处理这种异常?我程序中启动的线程就是为了加载DLL,然后调其中的函数
    DLL可能写的不好,会引发异常,但是DLL的编写者并没有处理我是调用者,我如何在我的代码中处理这种异常
      

  8.   

    我程序中启动的线程就是为了加载DLL,然后调其中的函数
    DLL可能写的不好,会引发异常,但是DLL的编写者并没有处理我是调用者,我如何在我的代码中处理这种异常如果DLL中的函数的执行是在你的线程函数中的话,那么只需要在线程函数中try/catch就行了,
    如果中间涉及其它线程(比如DLL中也创建了线程等),只能处理未处理异常了,但结果还是一个,那就是程序异常终止,但可以在终止前取得异常有关的详细信息。
      

  9.   

    如果DLL中的函数的执行是在你的线程函数中的话,那么只需要在线程函数中try/catch就行了,
    如果中间涉及其它线程(比如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?问题是我都不知道是什么异常啊
      

  10.   

    ###########################################################################
    ###########################################################################
    如果
    MyDllFun中有无穷循环
    我调用方又如何知道?如果
    MyDllFun
    申请内存
    不释放
    我调用方又如何知道?
    ###########################################################################
    ###########################################################################
      

  11.   

    所谓心跳就是隔一定的时间,线程向你的主线程发送一个消息——当然不一定要用Message,可以是Event,或者别的东西,反正让你的主线程知道它还活着就行了。如果进入死循环,就不能在正常发送心跳信息,那主线程检测到超时,就可以判断它死了。
    BoundsChecker是一个辅助工具,主要用于检查Memory Leak和Object leak,其余包括API参数校验之类的功能。
    SEH是结构化异常处理的简称,SEH和C++的异常处理不是一回事,SEH是Windows提供的,C++的异常处理是语言的一个特征,由编译器确保实现。
      

  12.   

    SEH是结构化异常处理的简称,SEH和C++的异常处理不是一回事,SEH是Windows提供的,C++的异常处理是语言的一个特征,由编译器确保实现。
    ------------------------
    正好手头有本书<<windows核心编程>>有一章讲这个,研究下,谢谢!
      

  13.   

    好像无法在成员函数中使用
    __try
    __finally
      

  14.   


    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;
    }
      

  15.   

    StartDll2是我的线程函数
    pfn()是我需要调用的Dll中的函数
    它里面会引起异常,但这个函数本身并没有处理
    比如里面有越界访问的错误
    如果我启了这个线程就会造成我程序的崩溃
      

  16.   

    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;
    }**********************************************************************
    **********************************************************************
    找到了答案
    原因:函数中涉及到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中的函数会引发的异常,调用方如何防止程序崩溃
    应该怎么才可以实现
    **********************************************************************
    **********************************************************************
      

  17.   

    **********************************************************************
    **********************************************************************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中的函数会引发的异常//这个函数本身没有处理异常
    调用方如何防止程序崩溃
    应该怎么才可以实现
    **********************************************************************
    **********************************************************************
      

  18.   

    处理不了.就自己写一个....晕死了.
    -----------------------
    你是说
    对于DLL中的函数会引发的异常//这个函数本身没有处理异常
    调用方如何防止程序崩溃
    这种情况无法处理?