线程投递问题

xiaolomg 2013-09-26 12:38:31
举个例子吧
void A()//线程A中执行
{
//Do Sth
B();//想使B在线程B中执行
//Do sth
}
如何实现使函数B在线程B中执行呢?win32和linux中分别怎么弄呢?
球大神指点呐。
PS:win32的sendmessage和postmesssage以及postthreadmessage都是要有窗口,还要来个msgloop来接受检测好不麻烦呐,有木有更好的方法呢?
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baihacker 2013-09-26
  • 打赏
  • 举报
回复
若是B线程为已知线程,可以参考chromium中base里的线程相关代码,但是,消息循环,事件等待,或者IO完成等待省不了。 似乎还可以利用一下APC在B线程上执行。
max_min_ 2013-09-26
  • 打赏
  • 举报
回复
把函数B的函数指针传递给线程B就好了
baihacker 2013-09-26
  • 打赏
  • 举报
回复

#include <cstdio>
#define _WIN32_WINNT 0x0500
#include <windows.h>

HANDLE orz = NULL;

DWORD __stdcall work(LPVOID lpThreadParameter)
{
	fprintf(stderr, "123\n");
	Sleep(2000);
	SetEvent(orz);
	return 0;
}

void example()
{
	orz = CreateEvent(NULL, TRUE, FALSE, NULL);
	QueueUserWorkItem(work, NULL, WT_EXECUTEDEFAULT);
	WaitForSingleObject(orz, INFINITE);
	CloseHandle(orz);
	orz = NULL;
}

int main()
{
	example();
	return 0;
}
赵4老师 2013-09-26
  • 打赏
  • 举报
回复
引用 12 楼 boyhailong 的回复:
[quote=引用 11 楼 zhao4zhong1 的回复:] 《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
赵大师 您来了 [/quote] 哦 《30天自制操作系统》
xiaolomg 2013-09-26
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
赵大师 您来了
赵4老师 2013-09-26
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
qq120848369 2013-09-26
  • 打赏
  • 举报
回复
线程间通信用队列,你以为能变戏法吗,写代码而已。
xiaolomg 2013-09-26
  • 打赏
  • 举报
回复
引用 7 楼 max_min_ 的回复:
[quote=引用 5 楼 boyhailong 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 把函数B的函数指针传递给线程B就好了
那参数呢 [/quote] 传递一个结构体地址嘛,结构体成员包括B函数地址,以及B函数参数[/quote] 好吧,这几天我会自己好好研究这部分,争取发篇blog,
baihacker 2013-09-26
  • 打赏
  • 举报
回复
引用 4 楼 boyhailong 的回复:
[quote=引用 1 楼 baihacker 的回复:]

#include <cstdio>
#define _WIN32_WINNT 0x0500
#include <windows.h>

HANDLE orz = NULL;

DWORD __stdcall work(LPVOID lpThreadParameter)
{
	fprintf(stderr, "123\n");
	Sleep(2000);
	SetEvent(orz);
	return 0;
}

void example()
{
	orz = CreateEvent(NULL, TRUE, FALSE, NULL);
	QueueUserWorkItem(work, NULL, WT_EXECUTEDEFAULT);
	WaitForSingleObject(orz, INFINITE);
	CloseHandle(orz);
	orz = NULL;
}

int main()
{
	example();
	return 0;
}
你这个是要同步啊 [/quote] 不同步的话,把Wait去了。。。
max_min_ 2013-09-26
  • 打赏
  • 举报
回复
引用 5 楼 boyhailong 的回复:
[quote=引用 2 楼 max_min_ 的回复:] 把函数B的函数指针传递给线程B就好了
那参数呢 [/quote] 传递一个结构体地址嘛,结构体成员包括B函数地址,以及B函数参数
xiaolomg 2013-09-26
  • 打赏
  • 举报
回复
引用 3 楼 baihacker 的回复:
若是B线程为已知线程,可以参考chromium中base里的线程相关代码,但是,消息循环,事件等待,或者IO完成等待省不了。 似乎还可以利用一下APC在B线程上执行。
嗯嗯,今天看看chromium里的相关实现
xiaolomg 2013-09-26
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
把函数B的函数指针传递给线程B就好了
那参数呢
xiaolomg 2013-09-26
  • 打赏
  • 举报
回复
引用 1 楼 baihacker 的回复:

#include <cstdio>
#define _WIN32_WINNT 0x0500
#include <windows.h>

HANDLE orz = NULL;

DWORD __stdcall work(LPVOID lpThreadParameter)
{
	fprintf(stderr, "123\n");
	Sleep(2000);
	SetEvent(orz);
	return 0;
}

void example()
{
	orz = CreateEvent(NULL, TRUE, FALSE, NULL);
	QueueUserWorkItem(work, NULL, WT_EXECUTEDEFAULT);
	WaitForSingleObject(orz, INFINITE);
	CloseHandle(orz);
	orz = NULL;
}

int main()
{
	example();
	return 0;
}
你这个是要同步啊

65,209

社区成员

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

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