读书人

有关结束线程有关问题

发布时间: 2012-02-11 09:51:35 作者: rapoo

有关结束线程问题
请问大家,我想下载一个文件,在下载过程中,我要中途结束线程,用到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;

希望对你有用.

读书人网 >VC/MFC

热点推荐