部分代码:
void CLineDown::DownHtmMail(HWND hWnd ,char *sEnterUrl,int nLine,int nLevel)//初始化
{
m_nLine=nLine;
m_nLevel=nLevel;
m_hWnd=hWnd;
m_nNowLine=1;
....
AfxBeginThread((AFX_THREADPROC)ThrDownHtm,(LPVOID)&ctLine[nItem],NULL,0,NULL,NULL);
}void CLineDown::AllotThr()//分配线程
{
CString sUrl;
BOOL bJob=FALSE;
LineMutex.Lock();
m_nNowLine--;//线程减1
int nLine=m_nNowLine;
LineMutex.Unlock();
for(int i=nLine; i<=m_nLine;i++)
{
bJob=FALSE;
for(int j=1; j<=m_nLevel;j++)
{
AUrlMutex.Lock();
if(m_sUrl[m_nLevel-j].GetSize()>0)//检查是否有网址需要下载
{
sUrl=m_sUrl[m_nLevel-j].GetAt(0);
m_sUrl[m_nLevel-j].RemoveAt(0,1);//删除一个网址
SendMessage(m_hWnd,MYWM_URL,0,(long )&sUrl);
LineMutex.Lock();
m_nNowLine++;//线程加1
LineMutex.Unlock();
int nItem=AddctLine(sUrl,m_nLevel-j+1);
AfxBeginThread((AFX_THREADPROC)LineDownHtm,(LPVOID)&ctLine[nItem],NULL,0,NULL,NULL);
bJob=TRUE;
break;
}
AUrlMutex.Unlock();
}
if(bJob==FALSE)
break;
}
}UINT CLineDown::ThrDownHtm(LPVOID pParam)
{
//取得所需参数
ctLineData *MyctLine=(ctLineData *)pParam;
CString sUrl=MyctLine->sUrl;
int nLevel=MyctLine->nLevel;
CLineDown *MyClass=MyctLine->MyClass;
MyClass->DelctLine(MyctLine->nItem);
//取得网址
char sUrlStr[1024],sSendStr[1024];
int nPos=sUrl.Find(":",10); wsprintf(sUrlStr,"%s",sUrl.Left(nPos));
wsprintf(sSendStr,"%s",sUrl.Right(sUrl.GetLength()-nPos-1));
char sHtmStr[102401];
long nLen=102401,nNext;
CGetHtm CHtmStr;//一个下载网页的类
if(CHtmStr.GetHtmStr(sUrlStr,sSendStr,sHtmStr,&nLen))//下载网页返回内容
{
if(nLevel<MyClass->m_nLevel)
{
CAnalyUrl cUrl;//一个提取网址链接的类
CString sHtm=sHtmStr;
cUrl.ItinHtm(&sHtm,sUrlStr);
CString sSubUrl;
while(cUrl.GetNextUrl(&sSubUrl))//提取网址
{
MyClass->AUrlMutex.Lock();
MyClass->m_sUrl[nLevel].Add(sSubUrl);
MyClass->AUrlMutex.Unlock();
}
}
}
MyClass->AllotThr();
return 0;
}
void CLineDown::DownHtmMail(HWND hWnd ,char *sEnterUrl,int nLine,int nLevel)//初始化
{
m_nLine=nLine;
m_nLevel=nLevel;
m_hWnd=hWnd;
m_nNowLine=1;
....
AfxBeginThread((AFX_THREADPROC)ThrDownHtm,(LPVOID)&ctLine[nItem],NULL,0,NULL,NULL);
}void CLineDown::AllotThr()//分配线程
{
CString sUrl;
BOOL bJob=FALSE;
LineMutex.Lock();
m_nNowLine--;//线程减1
int nLine=m_nNowLine;
LineMutex.Unlock();
for(int i=nLine; i<=m_nLine;i++)
{
bJob=FALSE;
for(int j=1; j<=m_nLevel;j++)
{
AUrlMutex.Lock();
if(m_sUrl[m_nLevel-j].GetSize()>0)//检查是否有网址需要下载
{
sUrl=m_sUrl[m_nLevel-j].GetAt(0);
m_sUrl[m_nLevel-j].RemoveAt(0,1);//删除一个网址
SendMessage(m_hWnd,MYWM_URL,0,(long )&sUrl);
LineMutex.Lock();
m_nNowLine++;//线程加1
LineMutex.Unlock();
int nItem=AddctLine(sUrl,m_nLevel-j+1);
AfxBeginThread((AFX_THREADPROC)LineDownHtm,(LPVOID)&ctLine[nItem],NULL,0,NULL,NULL);
bJob=TRUE;
break;
}
AUrlMutex.Unlock();
}
if(bJob==FALSE)
break;
}
}UINT CLineDown::ThrDownHtm(LPVOID pParam)
{
//取得所需参数
ctLineData *MyctLine=(ctLineData *)pParam;
CString sUrl=MyctLine->sUrl;
int nLevel=MyctLine->nLevel;
CLineDown *MyClass=MyctLine->MyClass;
MyClass->DelctLine(MyctLine->nItem);
//取得网址
char sUrlStr[1024],sSendStr[1024];
int nPos=sUrl.Find(":",10); wsprintf(sUrlStr,"%s",sUrl.Left(nPos));
wsprintf(sSendStr,"%s",sUrl.Right(sUrl.GetLength()-nPos-1));
char sHtmStr[102401];
long nLen=102401,nNext;
CGetHtm CHtmStr;//一个下载网页的类
if(CHtmStr.GetHtmStr(sUrlStr,sSendStr,sHtmStr,&nLen))//下载网页返回内容
{
if(nLevel<MyClass->m_nLevel)
{
CAnalyUrl cUrl;//一个提取网址链接的类
CString sHtm=sHtmStr;
cUrl.ItinHtm(&sHtm,sUrlStr);
CString sSubUrl;
while(cUrl.GetNextUrl(&sSubUrl))//提取网址
{
MyClass->AUrlMutex.Lock();
MyClass->m_sUrl[nLevel].Add(sSubUrl);
MyClass->AUrlMutex.Unlock();
}
}
}
MyClass->AllotThr();
return 0;
}
解决方案 »
- 如果dll没有dllmain,那里面的那些函数会执行吗?这和 dll的调用方式有关系吗?(比如load是方式之一)和函数是否为导出函数有关系吗?
- 得到记录条目出错
- Slider控件如何显示在自绘的图形上面,并控制自绘的横线
- 对话框的问题
- DOS下运行正常的程序为什么加个界面后在windows下不能运行?
- Win32句柄是什么概念,HINSTANCE是在哪个头文件声明的
- 帮帮忙吧:用CJLibrary生成的Outlook应用程序框架,其菜单只能是英文的? 急得要吐血了
- 新手求助:使用同一个线程函数创建多个线程,有问题
- CListCtrl控件的问题!
- 大侠请出手,up 有分
- 高分相送
- 俺写了个游戏修改器,平均搜索速度为0.4秒,不知道算不算快呀。
看看是不是这样几种原因 1。线程太多,2 非法网页URL 3,下载网页时出现问题,就是下载网页的那个类不太健壮,处理能力不大好上面的代码没有内存泄漏一类的问题
但问题的出现是在线程到了最大限制以后一段时间才出现的
即如果我最多可开30个线程
程序开了30个线程后运行了一段时间才出问题
[email protected]
[email protected]