VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1246|回复: 10

有关结束线程问题

[复制链接]

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-22 09:20:01 | 显示全部楼层 |阅读模式
请问大家,我想下载一个文件,在下载过程中,我要中途结束线程,用到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();
}
回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-2-1 08:45:02 | 显示全部楼层
while中加个标志量条件,在主线程设置需要退出的值,然后等待
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-14 10:30:01 | 显示全部楼层
因为往往运行到HttpSocket.Receive(pData,1024);会卡在那,所以我用强制退出,还有什么好的方法吗
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-2-14 20:15:01 | 显示全部楼层
因为往往运行到HttpSocket.Receive(pData,1024);会卡在那,所以我用强制退出,还有什么好的方法吗

-------------------------------------------------------------
卡在那里,是因为你的reveive还在等待接受,但服务器却没有send对应它,所以就一直“卡”在那,你接收文件的代码应该有点问题,这不是强制退出能解决的问题。
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-16 09:15:01 | 显示全部楼层
不是,正常情况下receive不会卡,我想是当receive卡在那时让他退出,这里先不讨论receive的问题
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-16 09:30:01 | 显示全部楼层
receive这里是正常的,只有特殊时候会卡在那,这里先不讨论receive问题,只是想怎么解决没关掉Downloadfile.close()的问题
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-16 19:00:01 | 显示全部楼层
强制退出的话,可以用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;

希望对你有用.
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-16 21:30:01 | 显示全部楼层
谢谢楼上的,但我怎么解决没关掉downloadfile.close()的问题呢
回复

使用道具 举报

1

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-6-19 18:45:01 | 显示全部楼层
不好意思,前面不是Receive,应该是.recv();听说是阻塞模式造成的,该怎么解决呢
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-8-15 21:00:02 | 显示全部楼层
我的代码中的线程是等到资源用完了才结束的.
要结束时你修改while(nCompletedSize < nFileSize)的条件,程序应该就可以执行到DownloadFile.Close();
不过你可能要用try  catch处理一下错误了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表