定义了一个全局结构体:
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这个值也没有数据,原因出在哪?请高手们帮忙指点一下。正确的做法应该怎么做呢?
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这个值也没有数据,原因出在哪?请高手们帮忙指点一下。正确的做法应该怎么做呢?
解决方案 »
- 将VC++6.0的程序移植到Win7,出现基础类停止工作的情况 是用静态链接的方法组成的exe文件
- 关于VC中的List Control
- 有谁知道,firefox是用什么开发工具开发的呀?是用vc6吗?
- 怎么使我的窗口在最前面,最起码要在“信使服务”对话框的前面?
- 求助:bitmap.exe在哪里?
- 急急急!!!请问如何得到当前时间并转换为:年-月-日 时:分:秒 的格式??
- vc中画箭头的函数是什么?
- btnenh4.ocx怎么解密,我不能在设计环境中使用它,谢谢
- 关于如何编程测试串行通讯误码率的问题,请高手帮忙!
- 一个VC++中定义变量的问题
- 0xC0000005: Access Violation 错误
- bmp为什么偏小?
int datalength=((SPARAM*)lpParameter)->datalength;
CString Name=((SPARAM*)lpParameter)->Name;
char* senddata=((SPARAM*)lpParameter)->sendData; //在这里得到的数据有问题???
我的结构体定义的是全局的,也没有看到什么地方有删除这个指针的操作。
datalength,Name的数据都是正常正确的,就是char*型senddata不知道为什么就是没有数据???
定义了一个全局结构体:
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;
}
如果这里的sData是局部指针,则在调线程中可能这个sData已经不存在了,所以pSParam->sData就可能成为野指针了
应该是char* senddata=((SPARAM*)lpParameter)->sData;最好采用成员变量的方式,还有可以把this指针放在结构体里,便于访问成员变量
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
}
char* senddata=((SPARAM*)lpParameter)->sendData;
改为
char* senddata=((SPARAM*)lpParameter)->sData;
strcpy(pSParam->sData, sData);试一下;
{
CString Name;
int datalength;
char sData[1024]; };
不要用指针, 用字符数组