我在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卡死.有什么办法
可以解决这个问题吗?谢谢了
等待状态.所以我想用线程来加载dll.这样它们就可以并行工作了.
所以我:
DWORD WINAPI myFunc(LPVOID lpVoid)
{
ShowDlg();//使用隐式加载dll中的显示对话框函数
}void CTestDlg::OnButton1()
{
CreateThread(NULL,0,myFunc,NULL,0,NULL);
}
这样可以正确编译但问题是dll中的窗体只闪了一下就给退出了.用sleep也不可以,这样会让exe卡死.有什么办法
可以解决这个问题吗?谢谢了
{
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);
}
类似这样的
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
dlg.ShowWindow(SW_NORMAL);
}
不是非模态的.
我想要是dll中的Dialog一直显示,而不exe中的.在exe的线程中加载dll中的ShowDlg这个函数让Dialog
一直在线程中显示啊
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);
}
}
HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,L"ENG_FLAG");
ShowDlg();//使用隐式加载dll中的显示对话框函数
WaitForSignalObejct(hEvent,INIFINE);
//退出线程,销毁资源
将这个hEnent用地址传到dll当中或者在dll当中用OPenEvent的方式打开名称为END_FLAG的对象。
当关闭dlg的时候将HEVENT,SetEvent(hEvnet)设置为触发状态,让线程退出,销毁资源。
#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);
}