有关CInternetSession和多线程下载的有关问题

有关CInternetSession和多线程下载的问题
正在写一个小程序,用来模拟google   maps或者Yahoo   maps的卫片浏览功能。
下载采用了CInternetSession中的OpenURL函数来进行操作。
采用了多线程下载的方式,同时下载   5*5   的图像。多线程采用MFC的消息队列进行同步,就是说每个线程下载完毕后向框架发送一个消息。
基本的功能是实现了,不过有两个致命的问题,请教一下:)

第一个问题:很多情况下,在没有下载完当前所有图像的时候,用户就会进行操作,这样就需要强行关闭正在下载中的线程,而由于采用了发送消息的方式,在线程中分配了内存,TerminateThread会导致内存的泄漏。有什么办法可以关闭线程,又保证不泄漏内存呢?

第二个问题:其实是在上一个问题的基础上的,同样是如果用户在没有下载完当前图像的时候执行操作,会出现OpenURL函数没有反应的情况。我进入到OpenURL函数中,发现执行到InternetOpenUrl函数后,OpenURL函数就没有反应了。这是什么原因呢?是因为强制关闭线程的时候,原有的CInternetSession没有关闭?还是因为连接到服务器的CInternetSession太多了?这些原因都是我瞎猜的,因为OpenURL函数也没有返回什么错误代码,仅仅是完全没有反应了。所以恳请解答!

不好意思,我对网络编程不熟悉,上面的问题不是很专业,请高手解答一下,多谢!


------解决方案--------------------
第1个问题: 下载的时候是可以停的, 你把每次读取的字节数弄少点, 等待读完退出下载就可以了.

解决1第2个问题应该也解决了.
------解决方案--------------------
> 无法和下载线程进行交互
没用过Windows同步内核对象?
------解决方案--------------------
给你几个同步的API封装类: 事件

给一个好用的类
#ifndef _CEVENT_SYNCHRONIZATION_H_
#define _CEVENT_SYNCHRONIZATION_H_

#include <cassert>

class CEventSync
{
public:

CEventSync(HANDLE *pHandle)
{
assert(pHandle);
m_pHandle=pHandle;
DWORD dwRet=WaitForSingleObject(*m_pHandle,INFINITE);
。。。。。。。。。。。。。。。。。。。。。。。。。。
ResetEvent(*m_pHandle);
assert(dwRet==WAIT_OBJECT_0);

if(dwRet!=WAIT_OBJECT_0)
{
。。。。。。。。。。。。。。
}
。。。。。。。。。。。。。。

}

virtual ~CEventSync()
{
SetEvent(*m_pHandle);
}


private:
HANDLE * m_pHandle;
};

#endif


使用方法:

HANDLE hEvent=CreateEvent(NULL,TRUE,TRUE, " ");
CEventSync EventSync(&hEvent); 自动同步,
如果有两个线程,同时在hEvent上使用EventSync(&hEvent);
那么其中一个会阻塞在EventSync(&hEvent);上,直到另一个结束。
简单易用
------解决方案--------------------
TerminateThread本身就是一个容易引起内存泄露的函数,最好采用同步EVENT事件通知结束
看看MSDN怎么说:

TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.