我在一个RecvThread中创建另一个线程Thread,传给他的参数char *pdata(是RecvThread中的局部变量),结果在Thread取参数,取出的东西为空。怎么弄呢?

解决方案 »

  1.   

    局部变量当函数执行完后会释放
    在前面加上static就行咯,楼主
      

  2.   

    也还不行呢。这个pData[是指向一个字符数组的。Quote=引用 3 楼 hkf314 的回复:]
    局部变量当函数执行完后会释放
    在前面加上static就行咯,楼主
    [/Quote]
      

  3.   

    不是。char buf[100]。  pData = buf的。
      

  4.   

    但是我用全局变量把数组中的内服全部复制,也还是为空。。那为什么我直接调用函数fun,不用线程就可以呢,在线程里也是用的这个fun函数。?
      

  5.   

    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指向的内容赋给全局变量,用全局变量传还是不行。。
      

  6.   

    pData = buf;你的buf定义的局部数组,pData保存的是该数组的指针,还不明白吗?出了作用域,即使你保存了该指针,但是该指针指向的数据已经不再有效了,你应该将buf数组中的每一个元素的值拷贝到你的全局变量数组中保存起来,而不是保存局部数组的地址值
      

  7.   

    全局变量,怎么用的?
    你先把他做成动态分配的试试 pData=new char[len];
      

  8.   

    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);
      

  9.   

    一个全局变量char str[1000],然后把buf + sizeof (ConnProto)后的内容复制进去的。
      

  10.   

    把buf也弄成static char buf[];