老问题了,关于关闭线程

bukkake 2008-04-09 04:22:27
我起一个工作线程用于ftp下载文件,希望用户可以随时关闭下载或超时自动停止下载
现在的处理方式是执行在CFtpConnection::GetFile这个关键操作时做判断:
while(!(m_pConnection->GetFile(strRemovePath, strLocalPath)) && (!m_bKillThread))
即下载不成功且没有做出中止线程的要求时就重新尝试,否则如果中止了线程就让线程自己退出

这样勉强可以处理小文件的情况,但是遇上下载大文件时我想中断下载,或者出现错误,线程卡在GetFile函数时就没办法了
我已经在线程里面建立了消息循环,但我发现即使我在卡住的时候PostThreadMessage给该线程,线程也是要处理完GetFile再处理我发出的退出线程的消息,那就和我想要随时中断线程的目的背道而驰了。

请问有什么方法可以随时关闭正在做长时间操作的线程。

顺便说一下如果下载文件的时候用CFtpConnection::OpenFile的话,在每次CInternetFile::Read的时候做判断都是可以随时中断,可这样每下载一个文件就要重新建立ftp连接,这对我的程序消耗过大,所以不能采用。如果还有其他折中的方法也请帮忙指出
...全文
272 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bukkake 2008-04-10
  • 打赏
  • 举报
回复
哦,我又试了一下,一close连接,GetFile立刻退出,只要把这个错误和下载失败的重试区分一下,应该就可以解决的
只是这样必须要把CFtpConnection变量作为成员变量了。
多谢各位特别是cnzdgs的回帖
cnzdgs 2008-04-10
  • 打赏
  • 举报
回复
Close是断开连接,这时线程应该从阻塞的函数中失败返回,接下来你自己处理释放各种资源并退出线程。
hityct1 2008-04-10
  • 打赏
  • 举报
回复
线程中的循环设置一个标志,下次循环的时候退出。要求每次循环的时间不要太长。
应该就可以了。
china_bai 2008-04-10
  • 打赏
  • 举报
回复
要想做到随时关闭比较耗时的线程,确实是个比较棘手的问题.

不推荐采用TerminateThread方法,原因上面几位都说了.

我想是否可以采用下面的方法:

在下载前先判断一下所要下载的文件的大小.

如果文件较小,则直接采用GetFile方法.

如果文件较大,要想保证随时中断,只能采用OpenFile加CInternetFile::Read的方式.

否则,除非自己实现CFtpConnection类,否则好像没有更好的办法了.

继续关注此问题.
bukkake 2008-04-10
  • 打赏
  • 举报
回复
比如线程里面的CString之类的,之后都是一堆不明所里的内存泄漏
而且只是停了CFtpConnection,但是整个线程还是没关闭啊,它还继续在做自己的事情,这麻烦就大了
难道只用MFC就做不到随时关闭下载线程了?
cnzdgs 2008-04-10
  • 打赏
  • 举报
回复
你所说的资源没有释放是指哪些资源?
bukkake 2008-04-10
  • 打赏
  • 举报
回复
用close确实可以关闭下载,但是整个线程的资源并没有得到释放,现在就是想要个比较完满的解决方法
Eleven 2008-04-09
  • 打赏
  • 举报
回复
Up!
scq2099yt 2008-04-09
  • 打赏
  • 举报
回复
up
zaodt 2008-04-09
  • 打赏
  • 举报
回复


这个,没做过。


不过你用的是 MFC 封装的类,可以看看它的源码。



如果可以,自己实现了,就是说不用 MFC 封装的类。


这个 CodeProject 中也有,根据标准协议自己写了。
cnzdgs 2008-04-09
  • 打赏
  • 举报
回复
查了一下MSDN,应该可以调CFtpConnection类的Close函数,你先试试。
bukkake 2008-04-09
  • 打赏
  • 举报
回复
不太好用TerminateThread,因为在下载的时候如果用此函数中断线程的话,会使中断线程时下载中的文件处于被占用状态,非得关闭程序之后才能删除,如果重新下载也会因为原文件存在而失败,而且用户看到一堆删不掉的文件也不好,所以才想让线程自己退出释放资源
cnzdgs 2008-04-09
  • 打赏
  • 举报
回复
直接TerminateThread。
用Socket时可以closesocket,CFtpConnection不知道是否有类似功能。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧