关于CreateThread传参数的问题。 我在一个RecvThread中创建另一个线程Thread,传给他的参数char *pdata(是RecvThread中的局部变量),结果在Thread取参数,取出的东西为空。怎么弄呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 局部变量当函数执行完后会释放在前面加上static就行咯,楼主 也还不行呢。这个pData[是指向一个字符数组的。Quote=引用 3 楼 hkf314 的回复:]局部变量当函数执行完后会释放在前面加上static就行咯,楼主[/Quote] 不是。char buf[100]。 pData = buf的。 但是我用全局变量把数组中的内服全部复制,也还是为空。。那为什么我直接调用函数fun,不用线程就可以呢,在线程里也是用的这个fun函数。? DWORD WINAPI RecvThread(LPVOID lpParam){ HWND hwnd = *(HWND *)lpParam; TCHAR buf[MAX_BUF]; TCHAR szError[MAX]; int recvlen; int len = sizeof (SOCKADDR); static char *pData; while(1) { ZeroMemory(pStr, MAX_BUF); ZeroMemory(buf, MAX_BUF); recvlen = recv(g_ClientSocket, buf, MAX_BUF, 0); if (SOCKET_ERROR == recvlen) { wsprintf(szError, "%s%d", TEXT("接收数据失败,错误号为:"), WSAGetLastError()); MessageBox(hwnd, szError, TEXT("提示"), MB_ICONWARNING); break; } if (recvlen > 0) { pData = buf; ConnProto *pcnn = (ConnProto *)pData; pData += sizeof (ConnProto); int type = pcnn->type; char s[20]; wsprintf(s, "%d", type); // MessageBox(hwnd, s, "client type", 0); switch(type) { case DOWNLOAD: { HANDLE handle = CreateThread(NULL, 0, DownloadThread, (LPVOID)(pData), 0, NULL); if (NULL == handle) { MessageBox(NULL, TEXT("创建失败!"), TEXT(""), 0); return 0; } CloseHandle(handle); break; }}DWORD WINAPI DownloadThread(LPVOID lpParam){ char *pData = (char *)lpParam; DownloadFile(pData); return 0;}把buf中pData指向的内容赋给全局变量,用全局变量传还是不行。。 pData = buf;你的buf定义的局部数组,pData保存的是该数组的指针,还不明白吗?出了作用域,即使你保存了该指针,但是该指针指向的数据已经不再有效了,你应该将buf数组中的每一个元素的值拷贝到你的全局变量数组中保存起来,而不是保存局部数组的地址值 全局变量,怎么用的?你先把他做成动态分配的试试 pData=new char[len]; typedef struct _MyData {//传递给线程的指针 CStatic *m_status;//状态栏 HWND m_hwnd; //主窗口} MYDATA, *PMYDATA;PMYDATA pData;pData = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));if( pData == NULL ) ExitProcess(2);pData->m_hwnd =this->m_hWnd ;pData->m_status =&m_status;AfxBeginThread(ThreadProc_Scan, pData);在线程ThreadProc_Scan里,用前:PMYDATA pData;pData = (PMYDATA)lpParam;用后:HeapFree(GetProcessHeap(), 0, pData); 一个全局变量char str[1000],然后把buf + sizeof (ConnProto)后的内容复制进去的。 把buf也弄成static char buf[]; 0.0与0 有区别呢??? 一个程序最多能容纳多少个线程 串行化求助 ***高手指点那里VC好找工作*** ******************怎样从 332 颜色转换到 888 颜色. VC++书籍超低价处理 如何进行阻塞通讯,我使用的socket! 怎么样把一个字符串"20030220"转换成 time_t ?? 请问在vc中如何将字符串类型转为16进制类型? 在win32 console 下怎么保存文件 *************简单问题求解答***************** 运动目标跟踪,目标区域图像裁剪,指针老是飞
在前面加上static就行咯,楼主
局部变量当函数执行完后会释放
在前面加上static就行咯,楼主
[/Quote]
{
HWND hwnd = *(HWND *)lpParam;
TCHAR buf[MAX_BUF];
TCHAR szError[MAX];
int recvlen;
int len = sizeof (SOCKADDR);
static char *pData;
while(1)
{
ZeroMemory(pStr, MAX_BUF);
ZeroMemory(buf, MAX_BUF);
recvlen = recv(g_ClientSocket, buf, MAX_BUF, 0);
if (SOCKET_ERROR == recvlen)
{
wsprintf(szError, "%s%d", TEXT("接收数据失败,错误号为:"), WSAGetLastError());
MessageBox(hwnd, szError, TEXT("提示"), MB_ICONWARNING);
break;
}
if (recvlen > 0)
{
pData = buf;
ConnProto *pcnn = (ConnProto *)pData;
pData += sizeof (ConnProto);
int type = pcnn->type;
char s[20];
wsprintf(s, "%d", type);
// MessageBox(hwnd, s, "client type", 0);
switch(type)
{
case DOWNLOAD:
{
HANDLE handle = CreateThread(NULL, 0, DownloadThread, (LPVOID)(pData), 0, NULL);
if (NULL == handle)
{
MessageBox(NULL, TEXT("创建失败!"), TEXT(""), 0);
return 0;
}
CloseHandle(handle);
break;
}
}
DWORD WINAPI DownloadThread(LPVOID lpParam)
{
char *pData = (char *)lpParam;
DownloadFile(pData);
return 0;
}
把buf中pData指向的内容赋给全局变量,用全局变量传还是不行。。
你先把他做成动态分配的试试 pData=new char[len];
CStatic *m_status;//状态栏
HWND m_hwnd; //主窗口
} MYDATA, *PMYDATA;
PMYDATA pData;
pData = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL )
ExitProcess(2);pData->m_hwnd =this->m_hWnd ;
pData->m_status =&m_status;AfxBeginThread(ThreadProc_Scan, pData);在线程ThreadProc_Scan里,用前:
PMYDATA pData;
pData = (PMYDATA)lpParam;
用后:
HeapFree(GetProcessHeap(), 0, pData);