线程函数如何向主函数中传递参数

z156284149 2008-11-15 10:56:28
我在主函数中开启了一个线程,该线程调用了另一个我写的头文件中的函数,在这个函数中一个数组被赋予值。现在我想在main函数中使用这个已经被赋值的数组,请问如何操作。我开始想用全局变量,不行。是不是需要线程间传递参数

main()
{
...
CreateThread(NULL,0,Thread,(LPVOID)d,0,NULL); //创建线程
...
}

DWORD WINAPI Thread(LPVOID dev) //线程函数
{
pcap_if_t *d = (pcap_if_t*)dev;
WaitForArpRepeatPacketThread(d); //调用ipactive.h中的函数
return 0;
}

####ipactive.h中定义了一个数组,并且向数组ipaddr[256]中加入了得到的多个IP地址的值

现在我想在main函数中能够使用这个数组,请问应该如何操作
...全文
431 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
etz2008 2008-11-22
  • 打赏
  • 举报
回复
DWORD __stdcall ClientMange(LPVOID lParam)
{
CTvserverDlg *TvServerDlg=(CTvserverDlg*)lParam;

int filelen=0;
char filesize[20];
char filename[100];
memset(filename,0,100);
if(SOCKET_ERROR==recv(TvServerDlg->m_sock_accept,filename,100,0))//First
{
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,6);
return 0;
}

::SendMessage(g_hWnd,WM_SERVER_RECORD,(int)filename,1);//First Get FileName
CFile sendFile;
sendFile.Open(filename,CFile::modeRead|CFile::typeBinary);
filelen=sendFile.GetLength();
memset(filesize,0,20);
_itoa(filelen,filesize,10);

if(!(TvServerDlg->On_Off))
{
return 0;
}
::SendMessage(g_hWnd,WM_SERVER_RECORD,filelen,2);//Send File Size
if(SOCKET_ERROR==send(TvServerDlg->m_sock_accept,filesize,20,0))//Second
{
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,6);
return 0;
}
byte* fileData=new byte[filelen];
sendFile.Read(fileData,filelen);

char recvbuf[3];
memset(recvbuf,0,3);

if(SOCKET_ERROR==recv(TvServerDlg->m_sock_accept,recvbuf,3,0))//Third
{
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,6);
return 0;
}
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,3);//Wait Response
if(!(TvServerDlg->On_Off))
{
delete fileData;
closesocket(TvServerDlg->m_sock_accept);
return 0;
}
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,4);//Start Load File
if(SOCKET_ERROR==send(TvServerDlg->m_sock_accept,(LPSTR)fileData,filelen+1,0))//Forth
{
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,6);
return 0;
}

delete fileData;
closesocket(TvServerDlg->m_sock_accept);
::SendMessage(g_hWnd,WM_SERVER_RECORD,0,5);//Finish Load File
return 0;
}
etz2008 2008-11-22
  • 打赏
  • 举报
回复
可以写一个类
然后传对数传递类对象指针进去
这样用指针就可以设置类对象里各数据成员赋值
这样就不涉及同步问题
并且这样也是可行的
你可以看一下我的代码
nodiebirdcomeback 2008-11-19
  • 打赏
  • 举报
回复
使用全局变量是可以的,但是要注意同步。
在多线程的使用应该遵循“写的时候不要读,读的时候不要写”的原则!
paerxiushi 2008-11-19
  • 打赏
  • 举报
回复
1.给主线程加个消息循环(使用PeekMessage),
2.自定义一个消息:
#define WM_MYNOTIFY WM_USER+12;
子线程使用PostThreadMessage发送消息:
定义wParam为数组中第一个参数的地址,lParam为数组的长度
3.PostThreadMessage(dwThreadID,WM_MYNOTIFY,ipaddr,255);
4.主线程在消息循环中接收消息WM_MYNOTIFY,然后对数组进行处理
lirongjun1985 2008-11-15
  • 打赏
  • 举报
回复
全局变量可以的 你可以在线程里把数组的地址传个全局变量 然后主函数就可以利用这个全局变量访问这个数组了 但是这样的共享资源的
情况一定要做好同步 不然很容易出错。

还有一种方法就是在主函数里创建一个数组 然后在调用线程函数的时候把这个数组的地址传到线程函数里 在线程函数里给这个数组赋值。

z156284149 2008-11-15
  • 打赏
  • 举报
回复
if (WAIT_OBJECT_0 == WaitForSingleObject(myThread,INFINITE)){
//DoSomething
}
能不能解释一下
我是不是需要在WaitForArpRepeatPacketThread(d)中返回我要的那个数组,然后在dosomething中得到他
僵哥 2008-11-15
  • 打赏
  • 举报
回复
main()
{
...
HANDLE myThread = CreateThread(NULL,0,Thread,(LPVOID)d,0,NULL); //创建线程
if (WAIT_OBJECT_0 == WaitForSingleObject(myThread,INFINITE)){
//DoSomething
}

...
}

15,471

社区成员

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

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