线程间通信

kim_jinye 2010-04-08 03:27:39
如题。

我现在有一个进程,其中这个进程当中的一个子线程需要向主线程发送数据,需要发送的数据是子线程创建的。请教大家该如何实现?

另外全局变量就不要讨论了,如果是发送消息的话我需要基于postmessage而不是sendmessage,请不要使用mfc。

谢谢大家,在线!
...全文
277 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kim_jinye 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiazai1978 的回复:]
是在windows下还是linux下的?
想到的方法有3个:
线程间的通讯没有进程间通讯那么方便啊

1.pipe,因为是fork继承的,子进程copy了父进程创建的pipe fd
2.socket,socket配合select,可以让父进程等待若干子进程完成任务,并取得最快一个完成任务子进程的运算结果。
3.我很奇怪啊,主线程和子线程的数据是共享的。你为什么不设个flag,子线程完成……
[/Quote]

貌似没懂
kim_jinye 2010-04-09
  • 打赏
  • 举报
回复
人人有分
kim_jinye 2010-04-09
  • 打赏
  • 举报
回复
人人有分
独酌逸醉 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiazai1978 的回复:]
是在windows下还是linux下的?
想到的方法有3个:
线程间的通讯没有进程间通讯那么方便啊

1.pipe,因为是fork继承的,子进程copy了父进程创建的pipe fd
2.socket,socket配合select,可以让父进程等待若干子进程完成任务,并取得最快一个完成任务子进程的运算结果。
3.我很奇怪啊,主线程和子线程的数据是共享的。你为什么不设个flag,子线程完成……
[/Quote]
哥,没听懂。
zwlzhj 2010-04-08
  • 打赏
  • 举报
回复
孙鑫的资料看一下,迎刃而解。
xiazai1978 2010-04-08
  • 打赏
  • 举报
回复
是在windows下还是linux下的?
想到的方法有3个:
线程间的通讯没有进程间通讯那么方便啊

1.pipe,因为是fork继承的,子进程copy了父进程创建的pipe fd
2.socket,socket配合select,可以让父进程等待若干子进程完成任务,并取得最快一个完成任务子进程的运算结果。
3.我很奇怪啊,主线程和子线程的数据是共享的。你为什么不设个flag,子线程完成操作,把flag设为1,主线程每次判断flag为1就读取和子线程共享的数据,这样才是最简单的。

没必要一定要用进程,线程间的通讯吧,简单的,才是最好的。
kim_jinye 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liln0530 的回复:]
引用 9 楼 kim_jinye 的回复:
引用 8 楼 liln0530 的回复:
你要发送什么数据就往里面写,如果数据复杂可以放在一个结构体中,然后再放进去当postmessage的参数。postmessage后面两参数都可以带。看下MSDN


postmessage立即返回后,数据就会消亡的


好像这个方法只能传LONG类型的,返回后你的数据就发出去了,不会销毁吧,我试了……
[/Quote]

貌似确实能够收到
liln0530 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kim_jinye 的回复:]
引用 8 楼 liln0530 的回复:
你要发送什么数据就往里面写,如果数据复杂可以放在一个结构体中,然后再放进去当postmessage的参数。postmessage后面两参数都可以带。看下MSDN


postmessage立即返回后,数据就会消亡的
[/Quote]

好像这个方法只能传LONG类型的,返回后你的数据就发出去了,不会销毁吧,我试了,得到了发送的数据
kim_jinye 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liln0530 的回复:]
你要发送什么数据就往里面写,如果数据复杂可以放在一个结构体中,然后再放进去当postmessage的参数。postmessage后面两参数都可以带。看下MSDN
[/Quote]

postmessage立即返回后,数据就会消亡的
liln0530 2010-04-08
  • 打赏
  • 举报
回复
你要发送什么数据就往里面写,如果数据复杂可以放在一个结构体中,然后再放进去当postmessage的参数。postmessage后面两参数都可以带。看下MSDN
bitxinhai 2010-04-08
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
#include<windows.h>

typedef struct _tag_Data
{
CRITICAL_SECTION m_Lock;
int *m_pData;
int m_iDataCount;

_tag_Data()
{
InitializeCriticalSection(&m_Lock);
m_pData = NULL;
m_iDataCount = 0;
}
~_tag_Data()
{

EnterCriticalSection(&m_Lock);

if(m_iDataCount > 0)
{
delete []m_pData;
m_pData = NULL;
}
m_iDataCount = 0;

LeaveCriticalSection(&m_Lock);

DeleteCriticalSection(&m_Lock);
}
}STR_DATA;

UINT ThreadProc(LPVOID pParam)
{
STR_DATA *pData = (STR_DATA *)pParam;

EnterCriticalSection(&pData->m_Lock);

pData->m_iDataCount = 100;
pData->m_pData = new int[100];

for(int i = 0;i < 100;i++)
pData->m_pData[i] = i;

LeaveCriticalSection(&pData->m_Lock);
return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{

STR_DATA data;

DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE )ThreadProc,(LPVOID)&data,NULL,&dwThreadID);


WaitForSingleObject(hThread,INFINITE);

for(int i = 0;i < data.m_iDataCount;i++)
{
cout<<data.m_pData[i]<<endl;
}

system("pause");

return 0;
}

仅供参考。。。。
kim_jinye 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liln0530 的回复:]
postmessage,主线程ID或者接受窗口的句柄作为第一个参数
[/Quote]

需要向主线程发送的数据在子线程中需要如何定义?
liln0530 2010-04-08
  • 打赏
  • 举报
回复
postmessage,主线程ID或者接受窗口的句柄作为第一个参数
flatfoosie 2010-04-08
  • 打赏
  • 举报
回复
有事件模块么?
同意沙发观点
LittleJohny 2010-04-08
  • 打赏
  • 举报
回复
1)PostThreadMessage
2)Pipes
zqlclj 2010-04-08
  • 打赏
  • 举报
回复
创建个消息响应事件,当子线程发送消息是主线程就可以接收了。
liln0530 2010-04-08
  • 打赏
  • 举报
回复
是不是可以创建一个event,让主线程接受这个事件,响应他

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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