我定义了一个结构体
typedef struct ThreadDate 
{  
CString strIP;
CString strType;
CString strName;
}ThreadDate;
然后在一个类page2的一个方法中定义了该结构体的一个变量ThreadDate StorePingVaule[1000];void CPage2Dlg::Ontese() 
{   TimeBegin();
    ThreadDate StorePingVaule[1000];
CComboBox* combobox=(CComboBox*)GetDlgItem(IDC_COMBO1);
CString strType;
    combobox->GetLBText(combobox->GetCurSel(),strType);
   
if (strType=="全部设备")
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();

int nStep,nNum,nProgressPos,nMax,nMin;


nNumArray=0;

nNum=m_grid.GetItemCount();
nStep = 100/nNum;
nProgressPos=0;
m_progress.GetRange(nMin,nMax); m_grid.DeleteAllItems();
CString sql;

sql.Format("select* from user order by addr desc");
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);

int num=0;
//初始化
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
{
StorePingVaule[num].strIP.Format("%s",(char*)(_bstr_t)m_pRecordset->GetCollect("addr"));
                StorePingVaule[num].strName=(char*)(_bstr_t)m_pRecordset->GetCollect("name");
StorePingVaule[num].strType=(char*)(_bstr_t)m_pRecordset->GetCollect("type");
num++;
}

m_pRecordset->MoveNext();
}//while is over
nNumArray=num;

m_AdoConn.ExitConnect(); {
int PingNum=0;
int nTempNUm=0;
int n1=0;
{       
/// AfxMessageBox((LPTSTR)(LPCTSTR)StorePingVaule[nTempNUm]);  //test
ThreadGrid MyPingThread;
StorePingVaule0[1000]=StorePingVaule[1000];
MyPingThread.StorePingVauleInThread=&StorePingVaule0[0];
MyPingThread.nNumArray=nNumArray;
MyPingThread.pList=&m_grid;
MyPingThread.pProgress=&m_progress;
MyPingThread.nStepProgress=nStep;
CWinThread* pThread=AfxBeginThread(ThreadFuncPing,&MyPingThread);
}

}
}  
else  {    int nStep,nNum,nProgressPos,nMax,nMin;
int nIsQuit=0;

nNumArray=0;

m_progress.GetRange(nMin,nMax);
nNum=m_grid.GetItemCount();
nStep = 100/nNum; ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();

CString sql;
sql.Format("select * from user where type ='" +strType+ "' order by addr desc"); _RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql); int num=0;
//初始化
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
{
 StorePingVaule[num].strIP.Format("%s",(char*)(_bstr_t)m_pRecordset->GetCollect("addr"));
 StorePingVaule[num].strName=(char*)(_bstr_t)m_pRecordset->GetCollect("name");
 StorePingVaule[num].strType=(char*)(_bstr_t)m_pRecordset->GetCollect("type");
     num++;
}

m_pRecordset->MoveNext();
}//while is over nNumArray=num;
m_AdoConn.ExitConnect();

int PingNum=0;
int nTempNUm=0;
int n1=0;
ThreadGrid MyPingThreadNotAll;
MyPingThreadNotAll.StorePingVauleInThread=&StorePingVaule[0];
MyPingThreadNotAll.nNumArray=nNumArray;
MyPingThreadNotAll.pList=&m_grid;
MyPingThreadNotAll.pProgress=&m_progress;
MyPingThreadNotAll.nStepProgress=nStep;
MyPingThreadNotAll.flag=&nIsQuit;
CWinThread* pThread=AfxBeginThread(ThreadFuncPing,&MyPingThreadNotAll); }//else is over    GetDlgItem(IDC_COMBO1)->EnableWindow();
// 
}其中在MyPingThreadNotAll.StorePingVauleInThread=&StorePingVaule[0];一句已经得不到&StorePingVaule[0];线程函数是一个全局的。问题的结果是在Relese下运行没错误,在Debug下运行记录变为不认识的汉字,该如何解决这个问题。本人菜鸟,不知道把问题描述清楚了没有,求高手帮忙!!

解决方案 »

  1.   

    我尝试把定义在方法Ontese()中的结构体变量ThreadDate StorePingVaule[1000];定义成全局变量,结果是运行没错,点击查询触发Ontese()时弹出 终止重试忽略 那个窗口,File:afxcmn.inl.
    是怎么回事?
      
      

  2.   

    程序太长,不想看了
    估计是你使用了栈内存作为线程参数传递给线程了,这样肯定会时程序崩溃的,因为线程运行是你的栈内存可能已经释放掉了,所以访问内存错误。
    是同堆内存(new方式)即可
      

  3.   

    不能用 CString ,改成 char buf[512]; 类似这种形式CString 是动态申请的内存。
      

  4.   

    typedef struct ThreadDate  

    char strIP[512];
    char strType[512];
    char strName[512];
    }ThreadDate;while(m_AdoConn.m_pRecordset->adoEOF==0)
    {
    {
    memset(StorePingValue[num].strIP, 0, 512);
    ..依次类推,初始化另外两个。赋值改成 memcpy 或者 strcpy 例如StorePingVaule[num].strType=(char*)(_bstr_t)m_pRecordset->GetCollect("type");改成strcpy(StorePingVaule[num].strType, (char*)(_bstr_t)m_pRecordset->GetCollect("type"))建议你用 memcpy 防止缓冲区溢出。
    num++;
    }
      

  5.   

    你是想在线程中取数据吗?
    ThreadGrid MyPingThreadNotAll;
    在线程运行时可能已经释放掉了
    ThreadDate StorePingVaule[1000];这个也是
    这两个都要定义成全局的或者动态分配
      

  6.   


    我刚试了试你的办法,不行啊。void *memcpy( void *dest, const void *src, size_t count );第三个参数我设的10。结果点击查询就弹出发送错误报告窗口。是不是还是那个结构体变量的问题? MyPingThread.StorePingVauleInThread=&StorePingVaule[0];变量的值就是乱码了。
    那个调试器我不太会用,总是进入汇编程序,怎么回事?
      

  7.   

    对啊。结合你的办法和xfill的办法,问题解决了。谢谢你们。高手就是高手。