exe中使用线程加载DLL中的Dialog

欢乐马_19e9 2011-01-06 01:43:18
我在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卡死.有什么办法
可以解决这个问题吗?谢谢了
...全文
126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kingsollyu 的回复:]
VisualEleven 你的怎么给退出啊?退不出去啊
[/Quote]
类似下面这样

CWinThread* m_pThread = NULL;

CAboutDlg* pDlg = NULL;
#define MSG_EXIT WM_USER+0x11

UINT __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);
}

欢乐马_19e9 2011-01-06
  • 打赏
  • 举报
回复
VisualEleven 你的怎么给退出啊?退不出去啊
欢乐马_19e9 2011-01-06
  • 打赏
  • 举报
回复
太谢谢VisualEleven啦.Thx,very thx
wangbo56916860 2011-01-06
  • 打赏
  • 举报
回复
一个线程有两个用户对象,窗口对象和挂钩对象。线程结束后,会销毁所有窗口对象,和挂钩对象。
HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,L"ENG_FLAG");
ShowDlg();//使用隐式加载dll中的显示对话框函数
WaitForSignalObejct(hEvent,INIFINE);
//退出线程,销毁资源
将这个hEnent用地址传到dll当中或者在dll当中用OPenEvent的方式打开名称为END_FLAG的对象。
当关闭dlg的时候将HEVENT,SetEvent(hEvnet)设置为触发状态,让线程退出,销毁资源。
wangbo56916860 2011-01-06
  • 打赏
  • 举报
回复
ShowDlg是子线程创建的,对话框归子线程所有,子线程运行结束以后,dialog就销毁了。
bragi523 2011-01-06
  • 打赏
  • 举报
回复
只是一个showdialog不会占用太多时间,你做了别的事吗?如果你做了阻塞线程的事,就把它拿到线程里,但界面操作最好就在主线程里面
Eleven 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kingsollyu 的回复:]
不是的啊.不是模态的.这是dll中的ShowDlg函数

C/C++ code

extern "C" __declspec (dllexport) void ShowDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
d……
[/Quote]
是啊,是非模态对话框,我没有说模态对话框啊,
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);
}
}
HuWenjin 2011-01-06
  • 打赏
  • 举报
回复
http://huwenjin.com/a/download/2011/0106/63.html

我的程序,你下载一个,解包后BOOKS里面有二套源代码,详细的注释,同时在线程中使用对话框。

你可以自己写一个DLL让我的主程序调用,测试一下
欢乐马_19e9 2011-01-06
  • 打赏
  • 举报
回复
不是的啊.不是模态的.这是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
一直在线程中显示啊
oyljerry 2011-01-06
  • 打赏
  • 举报
回复
创建非模态对话框,就不会阻塞EXE
Eleven 2011-01-06
  • 打赏
  • 举报
回复
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);
}

类似这样的
Eleven 2011-01-06
  • 打赏
  • 举报
回复
你的DLL种创建的是非模态对话框吧

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧