none
MFC DLL的C**APP()中加入 AfxBeginThread为什么会阻塞了? RRS feed

  • 问题

  • vc6.0作了一个简单的MFC DLL工程,部分代码如下:
    static UINT AsignJob(LPVOID Msg)
    {
        ......      //简单的功能代码。
        return true;
    }
    CNfcApp::CNfcApp()
    {
        // TODO: add construction code here,
        // Place all significant initialization in InitInstance
        MessageBox(NULL,"test","test",MB_OK);
        AfxBeginThread((AFX_THREADPROC)AsignJob,(LPVOID)NULL,0,0,CREATE_SUSPENDED,NULL);
        MessageBox(NULL,"test2","test2",MB_OK);
        int dd = GetLastError();
    }
    MessageBox(NULL,"test","test",MB_OK);执行了,MessageBox(NULL,"test2","test2",MB_OK);未执行。调试时阻塞在AfxBeginThread((AFX_THREADPROC)AsignJob,(LPVOID)NULL,0,0,CREATE_SUSPENDED,NULL);
    放在initinstance中好像也不行!
    2009年3月16日 0:11

答案

全部回复

  •  我这里没有问题,看看AsignJob里面做什么操作了?
    2009年3月16日 1:01
    版主
  •  AsignJob里面什么也没做,或者MessageBox(....),都会阻塞呀。
    2009年3月16日 1:30
  • vs 2008的MFC DLL工程,代码如下:
    #include "stdafx.h"
    #include "MFCDLL.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    //
    //TODO: 如果這個 DLL 是動態地對 MFC DLL 連結,
    //  那麼從這個 DLL 匯出的任何會呼叫
    //  MFC 內部的函式,都必須在函式一開頭加上 AFX_MANAGE_STATE
    //  巨集。
    //
    //  例如:
    //
    //  extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //  {
    //   AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //   // 此處為正常函式主體
    //  }
    //
    //  這個巨集一定要出現在每一個
    //  函式中,才能夠呼叫 MFC 的內部。這意味著
    //  它必須是函式內的第一個陳述式
    //  ,甚至必須在任何物件變數宣告前面
    //  ,因為它們的建構函式可能會產生對 MFC
    //  DLL 內部的呼叫。
    //
    //  請參閱 MFC 技術提示 33 和 58 中的
    //  詳細資料。
    //

    // CMFCDLLApp

    BEGIN_MESSAGE_MAP(CMFCDLLApp, CWinApp)
    END_MESSAGE_MAP()


    // CMFCDLLApp 建構
    UINT __cdecl AsignJob(LPVOID Msg)
    {
     MessageBox(NULL,L"vvvv",L"vvvv",MB_OK);
     return true;
    }
    CMFCDLLApp::CMFCDLLApp()
    {
     // TODO: 在此加入建構程式碼,
     // 將所有重要的初始設定加入 InitInstance 中
     AfxBeginThread(AsignJob,(LPVOID)NULL,0,0,0,0);
     MessageBox(NULL,L"ddd",L"dddd",MB_OK);
    }


    // 僅有的一個 CMFCDLLApp 物件

    CMFCDLLApp theApp;


    // CMFCDLLApp 初始設定

    BOOL CMFCDLLApp::InitInstance()
    {
     CWinApp::InitInstance();

     return TRUE;
    }
    无法弹出对话框!用 vc6.0好像也有这个问题,但是创建win32 dll工程并在DLLMAIN中使用_beginthreadex就可以,这是为什么?

    2009年3月16日 2:48
  • 2009年3月16日 17:47
    版主
  • 我也知道最好不要在DLL初始化的时候创建线程,我在别的论坛上也有问,也是得到这样的回答,可是现在的情况是二次开发,无法使用导出函数,只能在DLL中自动创建线程,该如何解决呢?
    2009年3月16日 23:41
  • CREATE_SUSPENDED

    The primary thread of the new process is created in a suspended state, and does not run until the ResumeThread function is called.


    你在建立线程的时候加上了这个参数,当然会阻塞了,必须在其他的线程调用ResumeThread才能解除阻塞~呵呵。


    Hello world
    2009年3月17日 6:24
    版主
  •  与CREATE_SUSPENDED没有关系,不设置这个参数一样阻塞。
    我想另外一种解决办法是:利用消息,可是DLL中没有消息泵。
    难道就没有一种办法可以解决这样一种问题了吗?
    2009年3月17日 6:32
  • 导出一个函数来做额外的初始化工作。
    MSMVP VC++
    2009年3月17日 14:21
    版主