定义了一个全局结构体:
struct SPARAM
{  
   CString Name;
   int datalength; 
   char* sData;};然后:
SPARAM*pSParam=new SPARAM;
pSParam->Name="abc";
pSParam->datalength=1396;
pSParam->sData=sData;          //经调试pSParam->sData是有数据的,而且数据是正确的接着创建一个线程(传递刚才结构体参数):
   HANDLE hThread=CreateThread(NULL,0,SendProc,(LPVOID)pSParam,0,NULL);
   CloseHandle(hThread);  在线程函数中:
DWORD WINAPI Conversion::SendProc(LPVOID lpParameter)
{
  int datalength=((SPARAM*)lpParameter)->datalength;
  CString Name=((SPARAM*)lpParameter)->Name;
  char* senddata=((SPARAM*)lpParameter)->sendData;   //在这里得到的数据有问题???  
  
}为什么我在线程函数中得不到的senddata的数据?? senddata写入文件中查看,什么都没有。
((SPARAM*)lpParameter)->sendData这个值也没有数据,原因出在哪?请高手们帮忙指点一下。正确的做法应该怎么做呢?

解决方案 »

  1.   

    Conversion::SendProc定义成静态的,不能是成员函数
      

  2.   

    char* sData; 指向的sData在进入线程后是不是释放了
      

  3.   

    你保证了pSParam的空间在堆上,sData指向的数据也放堆上,保证线程访问的时候数据有效
      

  4.   

    你在创建线程之后肯定删除了pSParam这个指针,或者已经过了pSParam这个变量的作用域
      

  5.   


    int datalength=((SPARAM*)lpParameter)->datalength; 
    CString Name=((SPARAM*)lpParameter)->Name; 
    char* senddata=((SPARAM*)lpParameter)->sendData;  //在这里得到的数据有问题???  
    我的结构体定义的是全局的,也没有看到什么地方有删除这个指针的操作。
    datalength,Name的数据都是正常正确的,就是char*型senddata不知道为什么就是没有数据???
      

  6.   

    创建线程后主线程又做了些什么?是不是把pSParam或者sData释放了?
      

  7.   

    你要检查一下sData指向的数据是不是释放了
      

  8.   

    不是说结构体,是说结构体的成员sData这个指针所指向的数据...
      

  9.   

    结构体没释放不代表sData指向的数据没有释放了
      

  10.   


    定义了一个全局结构体: 
    struct SPARAM 
    {  
      CString Name; 
      int datalength; 
      char* sData; }; 然后: 
    SPARAM*pSParam=new SPARAM; 
    pSParam->Name="abc"; 
    pSParam->datalength=1396; 
    pSParam->sData=sData;          //经调试pSParam->sData是有数据的,而且数据是正确的  错误点:你所指向的数据是错误的,是个局部变量接着创建一个线程(传递刚才结构体参数): 
      HANDLE hThread=CreateThread(NULL,0,SendProc,(LPVOID)pSParam,0,NULL); 
      CloseHandle(hThread);  在线程函数中: 
    DWORD WINAPI Conversion::SendProc(LPVOID lpParameter) 

      int datalength=((SPARAM*)lpParameter)->datalength; 
      CString Name=((SPARAM*)lpParameter)->Name; 
      char* senddata=((SPARAM*)lpParameter)->sendData;  //在这里得到的数据有问题???  

    如果为了保证正确,你可以有两种方法,一种是指向成员变量(保证在传递完以前不销毁),另外就是传递的结构体自己有这个内存存储空间定义了一个全局结构体: 
    struct SPARAM 
    {  
    //不建议用CString来作为结构体存储,不然你计算大小会出问题的,如果有错,可以用字符串数组
      CString Name; 
      int datalength; 
      CString sData;}; 然后: 
    SPARAM*pSParam=new SPARAM; 
    pSParam->Name="abc"; 
    pSParam->datalength=1396; 
    pSParam->sData=sData;接着创建一个线程(传递刚才结构体参数): 
      HANDLE hThread=CreateThread(NULL,0,SendProc,(LPVOID)pSParam,0,NULL); 
      CloseHandle(hThread);  在线程函数中: 
    DWORD WINAPI Conversion::SendProc(LPVOID lpParameter) 

      int datalength=((SPARAM*)lpParameter)->datalength; 
      CString Name=((SPARAM*)lpParameter)->Name; 
      char* senddata=((SPARAM*)lpParameter)->sData; 
      //这个地方也有问题,你new出来的空间迟早要删除,你在这用指针调用,如果空间删除了,指针就是野指针了
      
      delete lpParameter; //记得删除
      lpParameter = NULL;

      

  11.   

    pSParam->sData=sData;
    如果这里的sData是局部指针,则在调线程中可能这个sData已经不存在了,所以pSParam->sData就可能成为野指针了
      

  12.   

    char* senddata=((SPARAM*)lpParameter)->sendData;  
    应该是char* senddata=((SPARAM*)lpParameter)->sData;最好采用成员变量的方式,还有可以把this指针放在结构体里,便于访问成员变量
      

  13.   

    服!定义了一个全局结构体: 
    struct SPARAM 
    {  
      CString Name; 
      int datalength; 
      char* sData; //注意这个
    }; 在线程函数中: 
    DWORD WINAPI Conversion::SendProc(LPVOID lpParameter) 

      int datalength=((SPARAM*)lpParameter)->datalength; 
      CString Name=((SPARAM*)lpParameter)->Name; 
      char* senddata=((SPARAM*)lpParameter)->sendData;  //注意这个应该是sData
      

      

  14.   

    书写错误。
    char* senddata=((SPARAM*)lpParameter)->sendData;  
    改为
    char* senddata=((SPARAM*)lpParameter)->sData;  
      

  15.   

    在创建线程时,直接char* senddata= new char[strlen(sData) + 1];
    strcpy(pSParam->sData, sData);试一下;
      

  16.   

    pSParam->sData=sData;          //经调试pSParam->sData是有数据的,而且数据是正确的 这里的sData是局部变量吧。等线程用到的时候已经被修改了。
      

  17.   

    struct SPARAM 
    {  
      CString Name; 
      int datalength; 
      char sData[1024]; }; 
    不要用指针, 用字符数组