线程传递参数的问题

kone123 2010-01-07 08:58:19
怎么创建一个带参数的线程,怎么个写法?例如参数为 SOCKET m_socket;
HANDLE hThread;
hThread=CreateThread(NULL,0,RecvProc,&m_socket,0,NULL);
......


DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter) //线程入口函数
{
SOCKET sock=(SOCKET)lpParameter; 取出参数
.......
}
这个取出参数好像不对,具体该怎么取出传的参数?
...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
不动如岳 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 kone123 的回复:]
    怎么创建一个带参数的线程,怎么个写法?例如参数为  SOCKET m_socket;
          HANDLE  hThread;
hThread=CreateThread(NULL,0,RecvProc,&m_socket,0,NULL);
        ......


DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter)    //线程入口函数
{
    SOCKET sock=(SOCKET)lpParameter;    取出参数
    .......
}
这个取出参数好像不对,具体该怎么取出传的参数?
[/Quote]
socket其实就是int型的重定义。
但是创建线程的函数的那个参数默认是void *型的,其实也就是一个long型的数字。
你传进去的是socket的地址,所以在线程函数里面,你应该取那个参数的内容用 *lpParameter试试。

像这个东西,你多想想,指针也是数字,标识了内存的地址。
只要你知道你传进去的是什么,就行了,类型不匹配的话,就强制转换。
然后,在线程函数里面,按你想要的强制转换出来,就可以用了。
不知道,我说明白了没有,你多想想。

上面的不行的话,按下面的再试试。
hThread=CreateThread(NULL,0,RecvProc,(void *)m_socket,0,NULL);
DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter) //线程入口函数
{
SOCKET sock=(SOCKET)lpParameter; 取出参数
}
kone123 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ligeqiang 的回复:]
现象是什么?
传得值不对吗?
[/Quote]
应该没传进来吧,错误提示:sock是没定义的变量
wolffan3150 2010-01-08
  • 打赏
  • 举报
回复
CreateThread(NULL,0,RecvProc,this,0,NULL);

使用时(CPMACSDoc*)lpParam就行了,还可以得到别的参数。
yuanmoren 2010-01-08
  • 打赏
  • 举报
回复
还要注意一点:如果m_socket是局部变量的话,进入子线程传递的参数可能无效。
也就是说你要保证子线程的存活期内,m_socket是存在的
一般我都是把m_socket设为全局变量
ligeqiang 2010-01-07
  • 打赏
  • 举报
回复
现象是什么?
传得值不对吗?
kone123 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ligeqiang 的回复:]
SOCKET mysocket = *((SOCKET *)lpParam);

DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter)    //线程入口函数
{
    SOCKET mysocket = *((SOCKET *)lpParam);
    .......
}

试试看!
[/Quote]
不行
kone123 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zoulie 的回复:]
DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter)    //线程入口函数
{
   SOCKET sock=(SOCKET)lpParameter;    取出参数    .......
}
这个取出参数好像不对,具体该怎么取出传的参数?
//参数都说了是一个void的类型的指针,这样直接转换肯定是错的
应该取指针的值转换
[/Quote]
我知道那个是错的,就是具体不知道怎么用指针传啊?
zoulie 2010-01-07
  • 打赏
  • 举报
回复
DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter) //线程入口函数
{
SOCKET sock=(SOCKET)lpParameter; 取出参数 .......
}
这个取出参数好像不对,具体该怎么取出传的参数?
//参数都说了是一个void的类型的指针,这样直接转换肯定是错的
应该取指针的值转换
大海雪山 2010-01-07
  • 打赏
  • 举报
回复
也可以试试传this指针,
CreateThread(NULL,0,RecvProc,this,0,NULL);

使用时(CPMACSDoc*)lpParam就行了,还可以得到别的参数。
或者自己定义结构体,传指针进去
ligeqiang 2010-01-07
  • 打赏
  • 举报
回复
SOCKET mysocket = *((SOCKET *)lpParam);

DWORD WINAPI CPMACSDoc::RecvProc(LPVOID lpParameter) //线程入口函数
{
SOCKET mysocket = *((SOCKET *)lpParam);
.......
}

试试看!

15,471

社区成员

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

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