C++多线程 CreateThread传参问题

marvinXu 2013-08-29 01:08:40

void start(DWORD param)
{
HANDLE thread = CreateThread(NULL,0,param,NULL,0,NULL);
}

DWORD WINAPI threadFuc1(LPVOID ipParameter)
{
........
}
DWORD WINAPI threadFuc2(LPVOID ipParameter)
{
........
}
//如上,CreateThread 在函数中时,如何把函数名传过去,填写CreateThread的第三个参数(即线程函数)
...全文
686 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
onlyhuiyi 2013-08-30
  • 打赏
  • 举报
回复


typedef DWORD  (WINAPI* THREAD_FUNC_NAME )(LPVOID);

DWORD WINAPI thread1(LPVOID lpParam)
{
    std::cout << "thread 1 run" << std::endl;
    return 1;
}

DWORD WINAPI thread2(LPVOID lpParam)
{
    std::cout << "thread 2 run" << std::endl;
    return 1;
}

void start(THREAD_FUNC_NAME threadFun)
{
    HANDLE handle_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFun, NULL, 0, NULL);
}

void CFindFileDlg::OnBnClickedBtnFindfile()
{
    start(thread1);
    start(thread2);
}

这样用吧,我个人觉得用DWORD接收参数不好,应该明确接收某种类型的。
lm_whales 2013-08-30
  • 打赏
  • 举报
回复
强转吧!,不然就象9楼这样就最好了!
如还想传线程参数,定义个结构传指针,修改start的实现即可:

引用 9 楼 onlyhuiyi 的回复:


typedef DWORD (WINAPI* THREAD_FUNC_NAME )(LPVOID);

DWORD WINAPI thread1(LPVOID lpParam)
{
std::cout << "thread 1 run" << std::endl;
return 1;
}

DWORD WINAPI thread2(LPVOID lpParam)(
{
std::cout << "thread 2 run" << std::endl;
return 1;
}

void start(THREAD_FUNC_NAME threadFun)
{
HANDLE handle_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFun, NULL, 0, NULL);
}

void CFindFileDlg::OnBnClickedBtnFindfile()
{
start(thread1);
start(thread2);
}


这样用吧,我个人觉得用DWORD接收参数不好,应该明确接收某种类型的。


引用 9 楼 onlyhuiyi 的回复:


typedef DWORD (WINAPI* THREAD_FUNC_NAME )(LPVOID);

DWORD WINAPI thread1(LPVOID lpParam)
{
std::cout << "thread 1 run" << std::endl;
return 1;
}

DWORD WINAPI thread2(LPVOID lpParam)
{
std::cout << "thread 2 run" << std::endl;
return 1;
}

void start(THREAD_FUNC_NAME threadFun)
{
HANDLE handle_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFun, NULL, 0, NULL);
}

void CFindFileDlg::OnBnClickedBtnFindfile()
{
start(thread1);
start(thread2);
}


这样用吧,我个人觉得用DWORD接收参数不好,应该明确接收某种类型的。
marvinXu 2013-08-29
  • 打赏
  • 举报
回复
引用 7 楼 truexf 的回复:
[quote=引用 6 楼 xpy0313 的回复:]

void start(DWORD threadFuc)
{
	HANDLE thread = CreateThread(NULL,0,threadFuc,NULL,0,NULL);
}

DWORD WINAPI threadFuc1(LPVOID ipParameter)
{		
		........
}
DWORD WINAPI threadFuc2(LPVOID ipParameter)
{		
		........
}
void main()
{
	start(threadFuc1);
	start(threadFuc2);
}
可能没表述清楚吧,我希望的结果是这样,通过调用start时赋给不同的参数产生不同的线程。。
start((DWORD)threadFuc1); start((DWORD)threadFuc2);[/quote] 您测试过了吗,我写的DWORD threadFuc本身就是不对的
「已注销」 2013-08-29
  • 打赏
  • 举报
回复
引用 6 楼 xpy0313 的回复:

void start(DWORD threadFuc)
{
	HANDLE thread = CreateThread(NULL,0,threadFuc,NULL,0,NULL);
}

DWORD WINAPI threadFuc1(LPVOID ipParameter)
{		
		........
}
DWORD WINAPI threadFuc2(LPVOID ipParameter)
{		
		........
}
void main()
{
	start(threadFuc1);
	start(threadFuc2);
}
可能没表述清楚吧,我希望的结果是这样,通过调用start时赋给不同的参数产生不同的线程。。
start((DWORD)threadFuc1); start((DWORD)threadFuc2);
marvinXu 2013-08-29
  • 打赏
  • 举报
回复

void start(DWORD threadFuc)
{
	HANDLE thread = CreateThread(NULL,0,threadFuc,NULL,0,NULL);
}

DWORD WINAPI threadFuc1(LPVOID ipParameter)
{		
		........
}
DWORD WINAPI threadFuc2(LPVOID ipParameter)
{		
		........
}
void main()
{
	start(threadFuc1);
	start(threadFuc2);
}
可能没表述清楚吧,我希望的结果是这样,通过调用start时赋给不同的参数产生不同的线程。。
onlyhuiyi 2013-08-29
  • 打赏
  • 举报
回复
不知道你问得是线程函数的参数么? DWORD WINAPI UploadMultimediaFileThread(LPVOID lpParameter)这么定义。
max_min_ 2013-08-29
  • 打赏
  • 举报
回复
引用 2 楼 xpy0313 的回复:
[quote=引用 1 楼 max_min_ 的回复:]

MSDN中CreateThread原型:
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize, // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress, // thread function 这个传的函数指针了
  LPVOID lpParameter, // thread argument
  DWORD dwCreationFlags, // creation option
  LPDWORD lpThreadId // thread identifier
  );
这个我知道,我就是想问这个函数指针怎么作为其他函数的参数传递,也就是上面start()函数参数怎么填?[/quote] 直接添函数地址就可以了, 不需要传地址进来,当然你函数在这个接口前面定义
max_min_ 2013-08-29
  • 打赏
  • 举报
回复

 CreateThread(NULL, 0, threadFuc1, param, 0, NULL);
marvinXu 2013-08-29
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:

MSDN中CreateThread原型:
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize, // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress, // thread function 这个传的函数指针了
  LPVOID lpParameter, // thread argument
  DWORD dwCreationFlags, // creation option
  LPDWORD lpThreadId // thread identifier
  );
这个我知道,我就是想问这个函数指针怎么作为其他函数的参数传递,也就是上面start()函数参数怎么填?
max_min_ 2013-08-29
  • 打赏
  • 举报
回复

MSDN中CreateThread原型:
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
  SIZE_T dwStackSize, // initial stack size
  LPTHREAD_START_ROUTINE lpStartAddress, // thread function 这个传的函数指针了
  LPVOID lpParameter, // thread argument
  DWORD dwCreationFlags, // creation option
  LPDWORD lpThreadId // thread identifier
  );

64,644

社区成员

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

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