关于dll与exe的困窘

汪宁宇 2010-06-08 10:37:53
现在有一个dll,伪代码如下:
HANDLE   g_hThread;         // 线程句柄
CWaitDlg *g_pWaitDlg; // 非模态窗口
int g_nCurStep; // 当前步数
int g_nTotalStep; // 总步数

// 启动线程
void _stdcall StartThread()
{
HANDLE hThread;
hThread = CreateThread();
// ...
}

// 线程函数
DWORD _stdcall MyThread()
{
// 从串口读取
return ReadComData();
}

// 显示进度条
void _stdcall ShowDlg()
{
g_pWaitDlg = new CWaitDlg();
g_pWaitDlg->Create();
// ...
}

// 隐藏进度条
void _stdcall HideDlg()
{
if(g_pWait != NULL)
{
g_pWait.Destory();
delete pWait;
}
}

// 负责读取串口数据
int _stdcall ReadComData()
{
DWORD dwRead = 0;
dwRead = ReadFile(...);
if(dwRead > 0)
{
// 这里读完了串口,用什么样的方法通知主界面比较好?
HideDlg();
return;
}
}


主界面中启动线程的时候,则不知道线程何时读完了,这个问题怎么办?

另外,因为这个dll里读写的过程大概需要10几秒,如果直接用WaitForSingleObject等待线程函数的话,程序容易挂起并假死,有没有其他好一点的方法?
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-06-08
  • 打赏
  • 举报
回复
读完了发送消息给主线程就行了。
这不是鸭头 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lfchen 的回复:]
// 线程中SendMessage()给主线程
//
[/Quote]

// 线程中PostMessage()给主线程
//
  • 打赏
  • 举报
回复
// 线程中SendMessage()给主线程
//
一条晚起的虫 2010-06-08
  • 打赏
  • 举报
回复
// 线程中SendMessage()给主线程
//
xiuxianshen 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
线程中给主线程发送消息PostMessage()等,通知界面结束.
[/Quote]
这个可以
wodetaiyang_2010 2010-06-08
  • 打赏
  • 举报
回复
up.........
oyljerry 2010-06-08
  • 打赏
  • 举报
回复
线程中给主线程发送消息PostMessage()等,通知界面结束.
tufaqing 2010-06-08
  • 打赏
  • 举报
回复
WaitForSingleObject有好多种用法,可以只检测线程是否存在就可以立即返回的。可以用timer多次检测。也可以结束时主动向外面发消息或回调函数,通知外面结束了,外面再做处理。
jingzhongrong 2010-06-08
  • 打赏
  • 举报
回复
处理完后发送自定义消息给主界面
你妹的特盗不 2010-06-08
  • 打赏
  • 举报
回复
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
在dll中这能使用不行吧...

你得把你的主窗口的HWND传给你的DLL,然后DLL向这个HWND发送消息
向立天 2010-06-08
  • 打赏
  • 举报
回复
应该把你的主窗口句柄作为参数传到线程函数里
tufaqing 2010-06-08
  • 打赏
  • 举报
回复
不要这样用,还是弄一个导出函数吧,让外面应用程序设置一下,比如:
void SetNotifyWnd(CWnd *pWnd)
{
g_pWnd = pWnd;
}
然后使用这个g_pWnd就行了。
汪宁宇 2010-06-08
  • 打赏
  • 举报
回复
1、#define WM_MSG_UPLOAD WM_USER+101

2、afx_msg LRESULT OnUploadMsg(WPARAM wParam,LPARAM lParam);

3、 ON_MESSAGE(WM_MSG_UPLOAD,OnUploadMsg)

4、最后实现OnUploadMsg函数.

在dll中这样写:
void MainMsg()
{
// ::SendMessage((HWND)AfxGetMainWnd(),WM_MSG_UPLOAD,0,0);
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
}

但是发现AfxGetMainWnd()始终为空,请高手不惜赐教!

15,471

社区成员

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

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