以下步骤是建立程序
1、创建一个Dialog工程
2、在Project---Settings---link中加入ws2_32.lib 
3、界面上添加两个按钮,button1(运行),button2(停止),
再添加一个CWinThread * m_dlPosThread;
4、添加下面代码
/*
 *线程函数
 */
UINT SaveDownloadPos(void *pParent)
{
    CString strFile="c:\\temp\\test.log"; long nStartPos=13456890;

CFile tmpFile;
FILE *file;
if((file=fopen(strFile,"r"))==NULL)
{
tmpFile.Open(strFile, CFile::modeCreate|CFile::modeWrite | CFile::typeBinary|CFile::shareDenyWrite);
}
else
{
fclose(file);
/* CFileException ex;
if((tmpFile.Open(strFile,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyWrite),&ex)==0)
{
TCHAR szError[1024];
            ex.GetErrorMessage(szError, 1024); ::AfxMessageBox(szError);
tmpFile.Close();
tmpFile.Open(strFile,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyWrite);
}
*/
tmpFile.Open(strFile,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyWrite);
} while(1)
{
Sleep(100);
tmpFile.SeekToBegin(); for(int i=0;i<4;i++)
{
nStartPos+=i*100;
tmpFile.Write(&nStartPos,sizeof(long));
}  } return 1;
}5、线程调用
/*
 * 线程调用
 */
void CFileTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
m_dlPosThread=AfxBeginThread(SaveDownloadPos,(void*)this);

}
6、终止线程
/*
 * 终止线程
 */
void CFileTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
TerminateThread(m_dlPosThread->m_hThread,0);

}
7、编译运行
8、点击button1(运行),然后再点击button2(停止),再点击button1(运行)
问题出现。
请各位大侠帮忙解决,谢谢了!

解决方案 »

  1.   

    线程结束时怎么没有关闭线程中打开的文件句柄?
    不要用TerminateThread结束线程,应该给线程处理函数一个出口条件,以便线程在结束时清理资源(比如打开的文件句柄。)要手动操作CWinThread*,应该以暂停方式启动线程,并置m_bAutoDelete=FASLE.
    m_dlPosThread=AfxBeginThread(SaveDownloadPos,(void*)this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
    m_dlPosThread->m_bAutoDelete=FALSE;
    m_dlPosThread->ResumeThread();
      

  2.   

    因为你强行终止线程,tmpFile没有关闭,CFile::shareDenyWrite改为CFile::shareDenyNone试试
      

  3.   

    就你的代码而言,这样改:
    加一全局变量标志gExitFlag,决定线程是否退出。
    改为
             gExitFlag = 0;
    while(1)
    {
              if(gExitFlag)break;
              Sleep(100);
    tmpFile.SeekToBegin(); for(int i=0;i<4;i++)
    {
    nStartPos+=i*100;
    tmpFile.Write(&nStartPos,sizeof(long));
    }  }
             tmpFile.Close();
    void CFileTestDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    gExitFlag = 1;

    }
      

  4.   

    获得文件句柄void CFileTestDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    TerminateThread(m_dlPosThread->m_hThread,0);
             CloseHandle(文件句柄);

    }