我在dll中加入了一个Dialog.因为Dll中的Dialog要完成一定的工作,但dll在循环中的exe就会处于
等待状态.所以我想用线程来加载dll.这样它们就可以并行工作了.
所以我:
DWORD WINAPI myFunc(LPVOID lpVoid)
{
ShowDlg();//使用隐式加载dll中的显示对话框函数
}void CTestDlg::OnButton1() 
{
CreateThread(NULL,0,myFunc,NULL,0,NULL);
}
这样可以正确编译但问题是dll中的窗体只闪了一下就给退出了.用sleep也不可以,这样会让exe卡死.有什么办法
可以解决这个问题吗?谢谢了

解决方案 »

  1.   

    你的DLL种创建的是非模态对话框吧
      

  2.   

    CAboutDlg* pDlg = NULL;UINT __cdecl ThreadProc(LPVOID lParam)
    {
      pDlg = new CAboutDlg;
      pDlg->Create(IDD_ABOUTBOX);
      pDlg->ShowWindow(SW_SHOW);
        MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return 0;
    }
    void CXXXDlg::OnOK() 
    {
    // TODO: Add extra validation here
    if(pDlg)
    {
    pDlg->DestroyWindow();
    delete pDlg;
    pDlg = NULL;
    }
    AfxBeginThread(ThreadProc, NULL);
    }
    类似这样的
      

  3.   

    创建非模态对话框,就不会阻塞EXE
      

  4.   

    不是的啊.不是模态的.这是dll中的ShowDlg函数extern "C" __declspec (dllexport) void ShowDlg()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
    dlg.ShowWindow(SW_NORMAL);
    }
    不是非模态的.
    我想要是dll中的Dialog一直显示,而不exe中的.在exe的线程中加载dll中的ShowDlg这个函数让Dialog
    一直在线程中显示啊
      

  5.   

    http://huwenjin.com/a/download/2011/0106/63.html我的程序,你下载一个,解包后BOOKS里面有二套源代码,详细的注释,同时在线程中使用对话框。你可以自己写一个DLL让我的主程序调用,测试一下
      

  6.   

    是啊,是非模态对话框,我没有说模态对话框啊,
    extern "C" __declspec (dllexport) void ShowDlg()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
        dlg.ShowWindow(SW_NORMAL);    MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
      

  7.   

    只是一个showdialog不会占用太多时间,你做了别的事吗?如果你做了阻塞线程的事,就把它拿到线程里,但界面操作最好就在主线程里面
      

  8.   

    ShowDlg是子线程创建的,对话框归子线程所有,子线程运行结束以后,dialog就销毁了。
      

  9.   

    一个线程有两个用户对象,窗口对象和挂钩对象。线程结束后,会销毁所有窗口对象,和挂钩对象。
    HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,L"ENG_FLAG");
    ShowDlg();//使用隐式加载dll中的显示对话框函数
    WaitForSignalObejct(hEvent,INIFINE);
    //退出线程,销毁资源
    将这个hEnent用地址传到dll当中或者在dll当中用OPenEvent的方式打开名称为END_FLAG的对象。
    当关闭dlg的时候将HEVENT,SetEvent(hEvnet)设置为触发状态,让线程退出,销毁资源。
      

  10.   

    太谢谢VisualEleven啦.Thx,very thx
      

  11.   

    VisualEleven 你的怎么给退出啊?退不出去啊
      

  12.   

    类似下面这样CWinThread* m_pThread = NULL;CAboutDlg* pDlg = NULL;
    #define MSG_EXIT WM_USER+0x11UINT __cdecl ThreadProc(LPVOID lParam)
    {
    if(pDlg)
    {
    pDlg->DestroyWindow();
    delete pDlg;
    pDlg = NULL;
    }
    CAboutDlg* pDlg = new CAboutDlg;
    pDlg->Create(IDD_ABOUTBOX);
    pDlg->ShowWindow(SW_SHOW); MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
    if(MSG_EXIT == msg.message)
    {
    break;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } pDlg->DestroyWindow();
    delete pDlg;
    pDlg = NULL;
    return 0;
    }
    void CXXDlg::OnOK() 
    {
    // TODO: Add extra validation here

    m_pThread = AfxBeginThread(ThreadProc, NULL);
    }void CXXDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    if(m_pThread && m_pThread->m_hThread)
    m_pThread->PostThreadMessage(MSG_EXIT, 0, 0);
    }