VC中如何实现线程通信

tuyi899 2010-05-21 10:44:38
我创建了一个小线程,用于循环接受字符串,如果收到“shutup”,则在主线程执行退出工作——即强制下线。请问子线程如何让主线程知道该下线了,并执行下线。
...全文
189 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
cabbge 2010-05-29
  • 打赏
  • 举报
回复
mark
au200608 2010-05-28
  • 打赏
  • 举报
回复
楼主所谓的主线程和子线程,是否在同台机器同个进程里的两个线程?还是一个在服务器上,一个是在客户端,两台机器?或者同台机器的两个进程里? 因为方式不一样,处理方式也不一样的.
zhu7385606 2010-05-25
  • 打赏
  • 举报
回复
很好的东东!!!!!!
tuyi899 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 wangli820 的回复:]
发送消息或信号量,最简单的就是搞个全局变量,子线程退出时设置全局变量,然后主程序读取就OK
[/Quote]问题就在于主程序如何在不再开线程又不用卡在循环上就检测到全局变量背重设
wangli820 2010-05-24
  • 打赏
  • 举报
回复
发送消息或信号量,最简单的就是搞个全局变量,子线程退出时设置全局变量,然后主程序读取就OK
tuyi899 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yxwsbobo 的回复:]
再或者 如果主线成也不是消息循环 是计算其他东西的话,可以定义一个全局变量,当子线程接收后,修改这个变量的值,主线程定期检查这个值,变了的话就退出
[/Quote]怎样做到定期检查呢?不会是又要开个线程或是循环检验吧?似乎很近了,请多指教。
tuyi899 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yxwsbobo 的回复:]
所以要知道你的主线成在干嘛啊? 如果说主线成在计算 for(int i=0;i!=9999999;++i);

那你这功能不可能实现 除非子线程直接强制结束主线程


你的主线程是在消息循环吗? 那样的话可以自定义一个消息WM_USER+1 子线程完毕后发送这个消息,主线程接收到这个消息就退出好了 这个不会假死
[/Quote]主线程是一个客户端软件,用户可以做各种各样的操作,包括提取数据,存储数据等
sichuanwww 2010-05-22
  • 打赏
  • 举报
回复
简单的全局变量控制也可以撒。
longfeihufengyun 2010-05-22
  • 打赏
  • 举报
回复
这个是可以的,我的程序也是这样做的

[Quote=引用 22 楼 sichuanpb 的回复:]
简单的全局变量控制也可以撒。
[/Quote]
magic7004 2010-05-21
  • 打赏
  • 举报
回复
楼主还是去学点基础的吧,自定义消息都觉得难,就不要搞多线程了。
cyysd 2010-05-21
  • 打赏
  • 举报
回复

1.在头文件中#define WM_MY_MESSAGE (WM_USER+100)

2.写消息处理函数
LPESULT CUSERTHREAD::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}

3.在类头文件的AFX_MSG块中说明消息处理函数:
...
// 一般消息映射函数
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}

4.在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

[Quote=引用 6 楼 tuyi899 的回复:]
引用 5 楼 cyysd 的回复:
可以在主线程定义自定义消息,然后子线程收到shutup后,调用PostThreadMessage发送这个自定义的消息给主线程,主线程收到后,消息响应函数里就执行你需要执行的操作
自定义消息的定义是很有难度的啊,可否多指点一二。
[/Quote]
tuyi899 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cyysd 的回复:]
可以在主线程定义自定义消息,然后子线程收到shutup后,调用PostThreadMessage发送这个自定义的消息给主线程,主线程收到后,消息响应函数里就执行你需要执行的操作
[/Quote]自定义消息的定义是很有难度的啊,可否多指点一二。
Eleven 2010-05-21
  • 打赏
  • 举报
回复
你的子线程在return之前发送一个消息给主线程。。。
cyysd 2010-05-21
  • 打赏
  • 举报
回复
可以在主线程定义自定义消息,然后子线程收到shutup后,调用PostThreadMessage发送这个自定义的消息给主线程,主线程收到后,消息响应函数里就执行你需要执行的操作
tuyi899 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xylicon 的回复:]
可以用 PostThreadMessage
[/Quote]可否讲的更详细一点,谢谢
tuyi899 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xyzhaopeng 的回复:]
线程同步问题。
可以使用event来同步主线程和子线程。

主线程CreateEvent,人工重置,并等待此event,成功等待后退出程序。

子线程接收到"shutup"后,SetEvent,重置event为已通知状态。
[/Quote]但是我的主线程要做别的很多工作,不可能停下来等我发消息
cdsnpeter 2010-05-21
  • 打赏
  • 举报
回复
线程同步问题。
可以使用event来同步主线程和子线程。

主线程CreateEvent,人工重置,并等待此event,成功等待后退出程序。

子线程接收到"shutup"后,SetEvent,重置event为已通知状态。

xylicon 2010-05-21
  • 打赏
  • 举报
回复
可以用 PostThreadMessage
yxwsbobo 2010-05-21
  • 打赏
  • 举报
回复
再或者 如果主线成也不是消息循环 是计算其他东西的话,可以定义一个全局变量,当子线程接收后,修改这个变量的值,主线程定期检查这个值,变了的话就退出
yxwsbobo 2010-05-21
  • 打赏
  • 举报
回复
所以要知道你的主线成在干嘛啊? 如果说主线成在计算 for(int i=0;i!=9999999;++i);

那你这功能不可能实现 除非子线程直接强制结束主线程


你的主线程是在消息循环吗? 那样的话可以自定义一个消息WM_USER+1 子线程完毕后发送这个消息,主线程接收到这个消息就退出好了 这个不会假死
加载更多回复(10)

15,471

社区成员

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

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