首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

有关结束线程有关问题

2012-02-11 
有关结束线程问题请问大家,我想下载一个文件,在下载过程中,我要中途结束线程,用到TerminateThread()但Dow

有关结束线程问题
请问大家,我想下载一个文件,在下载过程中,我要中途结束线程,用到TerminateThread();但Downloadfile.close()还没有运行到,要怎么办???
UINT   Download(void   *pArg)
{
                CFile   DownloadFile;
DownloadFile.Open(strDirectory,CFile::modeCreate   |     CFile::modeWrite|CFile::modeNoTruncate);

while(nCompletedSize   <   nFileSize)
{    


nReceSize   =   HttpSocket.Receive(pData,1024);
DownloadFile.Write(pData,nReceSize);
nCompletedSize   +=   nReceSize;

}                
DownloadFile.Close();
}

[解决办法]
因为往往运行到HttpSocket.Receive(pData,1024);会卡在那,所以我用强制退出,还有什么好的方法吗

-------------------------
卡在那里,是因为你的reveive还在等待接受,但服务器却没有send对应它,所以就一直“卡”在那,你接收文件的代码应该有点问题,这不是强制退出能解决的问题。
[解决办法]
强制退出的话,可以用endThread.同是这个函数要在线程中使用.不过不提倡用这种方法.
一般来说还是用TerminateThread();
给两个函数你参考一下:
void MyThread::WaitForThreadToTerminate( HANDLE hThread ) //等待线程终止
{
DWORD dwRet;
do
{
dwRet = ::MsgWaitForMultipleObjects( 1, &hThread, FALSE,
INFINITE, QS_ALLINPUT);
if ( dwRet != WAIT_OBJECT_0 )
{
PeekMessageLoop( );
}
} while ( ( dwRet != WAIT_OBJECT_0 ) && ( dwRet != WAIT_FAILED ) );
}

void MyThread::PeekMessageLoop( )
{
MSG msg;
while ( PeekMessage( &msg, NULL, NULL, NULL, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}


MyThread::~MyThread()
{

EndThread_Proc();
if( bEndTDde )
{
WaitForThreadToTerminate( pMyThread-> m_hThread );
}

}

void MyThread::EndThread_Proc()
{
bEndTDde= True;
}

CWinThread *pMyThread;
BOOL bEndTDde;

希望对你有用.

热点排行