错误提示:File:thrdcore.cpp
          Line:113
我把这个thrdcore.cpp的内容放在下面,请问这个提示说明我的程序什么地方有错误!?
// wait for thread to be resumed
VERIFY(::WaitForSingleObject(hEvent2, INFINITE) == WAIT_OBJECT_0);
::CloseHandle(hEvent2); // first -- check for simple worker thread
DWORD nResult = 0;
if (pThread->m_pfnThreadProc != NULL)
{
nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams);
ASSERT_VALID(pThread);<----------错误指向这里
}
// else -- check for thread with message loop
else if (!pThread->InitInstance())
{
ASSERT_VALID(pThread);
nResult = pThread->ExitInstance();
}
else
{
// will stop after PostQuitMessage called
ASSERT_VALID(pThread);
nResult = pThread->Run();
}

解决方案 »

  1.   

    这是vc的代码吧。
    查看callstack窗口定位你的出错代码
      

  2.   

    我用了call back(不知道使用方法对否)(先点debug的go,然后点了call back)
    出来的提示:call Stack
                (call stack unavailable while child is running)请问是什么回事?多谢了
      

  3.   

    代码部分请参照
    http://expert.csdn.net/Expert/topic/2550/2550381.xml?temp=.1919519
      

  4.   

    UINT Respond(LPVOID pParam)
    {
    char temp[40];
    long k;
    double step=0.5;
    double daFreq=*(double*)pParam;
    DWORD sum=0;
    //CWinThread* ResThread; RespondStart=1;
    //sprintf(temp,"daFreq=%2.1f",daFreq);
    //MessageBox(NULL,temp,"",MB_OK);
    //float da_Mag1=0.1;
    if(sequence[NumOfFreNow]!=0) 
    {
    CWinThread* ResThread=AfxBeginThread(GetRespond,&daFreq,THREAD_PRIORITY_NORMAL,
    0,CREATE_SUSPENDED,0);
    ResThread->m_bAutoDelete=FALSE;
    ResThread->ResumeThread();
    WaitForSingleObject(ResThread->m_hThread,INFINITE);
    DWORD dwExitCode;
    ::GetExitCodeThread(ResThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    Sleep(1000);

    }
    else
    delete ResThread; k=respond;
    if(fabs(k-ini)>1)
    {
    if(k>ini)
    da_Mag[NumOfFreNow]-=0.01;
    else
    da_Mag[NumOfFreNow]+=0.01;
    }

    }
    else
    {
    //Start=GetTickCount();
    again:
    da_Mag[NumOfFreNow]=0.1;
    //CWinThread* ResThread=AfxBeginThread(GetRespond(daFreq,da_Mag);
    CWinThread* ResThread=AfxBeginThread(GetRespond,&daFreq,THREAD_PRIORITY_NORMAL,
    0,CREATE_SUSPENDED,0);
    ResThread->m_bAutoDelete=FALSE;
    ResThread->ResumeThread();
    WaitForSingleObject(ResThread->m_hThread,INFINITE);
    DWORD dwExitCode;
    ::GetExitCodeThread(ResThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    Sleep(1000);

    }
    else
    delete ResThread;
    k=respond;
    if(k>ini)
    {
    /*
    file.SeekToEnd();
    sprintf(temp,"da_Mag now=%2.1f",da_Mag);
    file.Write(temp,lstrlen(temp));
    file.SeekToEnd();
    sprintf(temp,"respond now=%d",k);
    file.Write(temp,lstrlen(temp));
    */
    //
    sum++;
    if(sum<=2) goto again;
    else
    {
    AfxMessageBox("测量的最小应变大于给定的应变值");
    sum=0;
    return 0;
    }
    }
    else
    {
    int n_step=1;
    while(fabs(k-ini)>n_step)
    {
    while(k<ini-n_step)
    {
    da_Mag[NumOfFreNow]+=step;
    if(da_Mag[NumOfFreNow]>MaxBattery)
    {
    AfxMessageBox("给的应变太大了");
    return 0;
    }
    //k=GetRespond(daFreq,da_Mag);
    CWinThread* ResThread=AfxBeginThread(GetRespond,&daFreq,THREAD_PRIORITY_NORMAL,
    0,CREATE_SUSPENDED,0);
    ResThread->m_bAutoDelete=FALSE;
    ResThread->ResumeThread();
    WaitForSingleObject(ResThread->m_hThread,INFINITE);
    DWORD dwExitCode;
    ::GetExitCodeThread(ResThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    Sleep(1000);
    }
    else delete ResThread;
    k=respond;
    }
    step=step/2.0;
    while(k>ini+n_step)
    {
    da_Mag[NumOfFreNow]-=step;
    //k=GetRespond(daFreq,da_Mag);
    CWinThread* ResThread=AfxBeginThread(GetRespond,&daFreq,THREAD_PRIORITY_NORMAL,
    0,CREATE_SUSPENDED,0);
    ResThread->m_bAutoDelete=FALSE;
    ResThread->ResumeThread();
    WaitForSingleObject(ResThread->m_hThread,INFINITE);
    DWORD dwExitCode;
    ::GetExitCodeThread(ResThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    Sleep(1000);

    }
    else delete ResThread;
    k=respond;
    step/=2.0;
    }
    }
    }
    } //if(sequence!=0)
    //{
    //sprintf(temp,"da_Mag=%2.1f",da_Mag);
    //MessageBox(NULL,temp,"",MB_OK);
    //Start=GetTickCount();
    //k=GetRespond(daFreq,da_Mag);

    //}

    /*
    k2=GetRespond(daFreq,da_Mag2);
    if(k2<ini)
    {
    file.SeekToEnd();
    sprintf(temp,"respond now=%d",k2);
    file.Write(temp,lstrlen(temp));
    MessageBox(NULL,"the max smaller than the ini","Attention!",MB_OK);

    return 0;
    }

    da_Mag=(da_Mag1+da_Mag2)/2;
    L:
    k=GetRespond(daFreq,da_Mag);
    while(fabs(k-ini)>1)
    {
    if(k>ini)
    da_Mag2=da_Mag;
    else
    da_Mag1=da_Mag;
    da_Mag=(da_Mag1+da_Mag2)/2;
    k=GetRespond(daFreq,da_Mag);
    }
    */
    FreqencyValue=daFreq;
    DWORD sumTime=0;
    Fulia(); Now=GetTickCount();
    sumTime=(Now-Start)/1000;
    if(ForceTemperatureFlag)
    {
    file.SeekToEnd();
    //sprintf(temp,"Temperature now=%4.1f\r\n",(float)PV/10.0);
    if(Value>0)
    {
    sprintf(temp,"%ld\t%d\t%2.5f\t%4.1f\t%3.5f\t%2.5f\r\n",sumTime,
    k,daFreq,PV/10.0,ValueM,Value);
    file.Write(temp,lstrlen(temp));
    }
    //Start=GetTickCount();
    }
    else
    {
    file.SeekToEnd();
    if(Value>0)
    {
    sprintf(temp,"%ld\t%d\t%2.5f\t%3.5f\t%2.5f\r\n",sumTime,
    k,daFreq,ValueM,Value);
    file.Write(temp,lstrlen(temp));
    }
    }

    return 0;
    }
    UINT TemperatureChart(LPVOID pParam)
    {
    long i=0;
    //int sum=0;
    Start=GetTickCount();
    Now=GetTickCount();
    CString str;
    for(int j=0;j<10000;j++)
    sequence[j]=0;
    while(((Now-Start)/1000)<(TotalTime*60))              //总的运行时间
    {
    double ff=FrequencyArray[i];
    NumOfFreNow=i;
    str="before Motor_zero ";
    file.Write(str,str.GetLength());

    Motor_Zero();
    str="behind Motor_zero ";
    file.Write(str,str.GetLength());
    if(ff>0)
    {
    str.Format("Frequency=%f",ff);
    file.Write(str,str.GetLength());
    CWinThread* pChildThread=AfxBeginThread(Respond,&ff,
    THREAD_PRIORITY_TIME_CRITICAL,
    0,CREATE_SUSPENDED,0);
    pChildThread->m_bAutoDelete=FALSE;
    pChildThread->ResumeThread();
    file.SeekToEnd();
    str="Respond Thread Start!";
    file.Write(str,str.GetLength());
    str.Format("  i=%d ",i);
    file.Write(str,str.GetLength());
    //WaitForSingleObject(pChildThread->m_hThread,(1/ff)*8000);
    //waiting
    DWORD result=WaitForSingleObject(pChildThread->m_hThread,INFINITE);
    switch(result)
    {
    case WAIT_OBJECT_0:
    str=" WAIT_OBJECT_0 ";
    file.Write(str,str.GetLength());
    break;
    case WAIT_FAILED:
    str=" WAIT_FAILED ";
    file.Write(str,str.GetLength());
    result=GetLastError();
    str.Format("result=%ld",result);
    file.Write(str,str.GetLength());
    break;
    default:
    str.Format("result=%ld",result);
    file.Write(str,str.GetLength());
    }
    //Sleep(1000);
    DWORD dwExitCode;
    ::GetExitCodeThread(pChildThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    //Sleep(1000);
    //::GetExitCodeThread(pChildThread->m_hThread,&dwExitCode);
    }
    else delete pChildThread;
    //FreqencyValue+=0.2;
    sequence[i]=1;
    /*sum++;
    if(sum%20==0)
    {
    DRV_DeviceClose((LONG far *)&daDriverHandle);
    daDevice=0;
    Sleep(30000);
    //open da device
    ErrCde = DRV_DeviceOpen(dwdaDeviceNum,(LONG far *)&daDriverHandle);
     if (ErrCde != SUCCESS)
     {
     DRV_GetErrorMessage(ErrCde,(LPSTR)szErrMsg);
     MessageBox(NULL,(LPCSTR)szErrMsg,"Device Open",MB_OK);
     return 0;
      }
    daDevice=1;   //da device open
    }*/
    }
    i++;
    i=i%LenOfFrequencyArray;
    if(i==LenOfFrequencyArray) i=0;
    Now=GetTickCount(); 
    str.Format("Now=%ld  ",Now);
    file.Write(str,str.GetLength());
    //Sleep(1);
    }
    }
    void CMainFrame::OnForceFrequence() 
    {
    CWinThread* pTempChartThread=AfxBeginThread(TemperatureChart,this,
    THREAD_PRIORITY_TIME_CRITICAL,0,CREATE_SUSPENDED ,0);
    pTempChartThread->m_bAutoDelete=FALSE;
    pTempChartThread->ResumeThread();
    }
    void CMainFrame::OnClose()
    {
    DWORD dwExitCode;
    ::GetExitCodeThread(pTempChartThread->m_hThread,&dwExitCode);
    if(dwExitCode==STILL_ACTIVE)
    {
    //Sleep(1000);
    //::GetExitCodeThread(pChildThread->m_hThread,&dwExitCode);
    }
    else delete pTempChartThread;
    }