多线程从网页中读取数据,程序运行一段时间就会出现连接错误~~

时间:2022-02-01 17:09:49

本人系菜鸟一个,,刚接触网络程序。 多线程也只是有个概念,程序写的时候就是想当然,执行的时候问题特多。来求大虾指点迷经,呵呵,分不是问题。
   下面是我的程序设计思路:
     程序目的: 从网页中读取数据信息。 大概一个页面有几十个数据是我需 要的。方式用CHttpFile得到网页的源码分析得到。刷新这个页面,数据会得到更新。所以只要我不断的请求这个页面就会得到大量的数据,以供我分析。

     实现过程:对话框程序。。写了一个线程类,主要想法是利用同一个线程函数(静态的成员函数)根据不同的对象成员变量strURL不同,访问不同的页面。一个页面我又开了5个线程。想加快搜索速度。
      (由于线程函数必须写成静态的,那么他就不能访问非静态成员变量,我就把this指针当线程参数传了进来,读取非静态成员变量。)(不知道这么弄会不会有问题,当时没有想出好的办法.)
在对话框代码:   CMyThread thread;
        thread.StartThread(5, this);

void CMyThread::StartThread(int num, CMyThread * p){
    for (int i=0; i<num; i++){
     AfxBeginThread(MyThreadFun, (LPVOID)p);
  }
}
线程函数 static UINT CMyThread::MyThreadFun(LPVOID lpParam){
       CMyThread *pThis = (CSearchThread *)lpParam;
  CString strData; //网页源码
  CString strBuf;  
  CInternetSession ise;
  CHttpFile* hFile = NULL;
  while (!ms_bStop){ //ms_bStop 控制线程结束的
strData = "";
strBuf == "";
strQQNum= "";
num = 0;
try{
 hFile = (CHttpFile*)ise.OpenURL(pThis->m_strURL); //刷新网页的到新的数据
if (hFile == NULL){
                                     AfxMessageBox("open error");
return -1;
}
while(hFile->ReadString(strBuf))
{
strData+=strBuf;
}
                           //下面还有分析html源码,得到我想要的数据,以及将得到数据在对话框显示的程序
                          ......
                   }catch(CInternetException *e){
                       char msg[256];
                       e->GetErrorMessage(msg, 256);
                       AfxMessageBox(msg);
                   }
          }
         delete hFile;
        ise.close();

    
}

以上是这个程序的重要代码段...

出现的问题:
      程序得到的数据比较慢,线程都停在hFile = (CHttpFile*)ise.OpenURL(pThis->m_strURL); 这里很长时间,并不是预想的时间能错开.会源源不断地得到数据.
     程序运行了一段时间后(大约几分钟,就会有个别线程访问网页异常.  通过对话框返回的错误信息是, 连接的回应信息不可识别,处理超时.这两种错误.(请大虾指点迷经)
    程序退出会有错误提示,不知道是不是线程没有结束的原因. 通过bool变量控制线程结束不是很及时.. 要等下面的程序处理完才能结束..有没有其他好的结束线程的方法..程序退出会有错误提示,什么原因呢...RELEASE版就没有了..是不是有内存泄露阿.! 我线程类里面还存有对话框的this指针..会不会这里也有问题. 
   大家有没有好的线程和程序通信的好方法...通过消息么?




   

     
      
     

10 个解决方案

#1


呵呵,

无人问津阿。。自顶一下。。

斑竹来帮帮忙了
。。

#2


别沉,在顶。。

大家看到的帮顶一下了。。。

问题解决就放分

#3


怎么都米有人看的...5555


#4


帮顶吧。!~

#5


没有来得及看你的程序.

你先把你的程序编译成Release模式的试试.

#6


写写。。release编译没有了内存错误但感觉肯定有问题~~


现在想要提升一些速度要怎么做。。 

 还有程序关闭。。线程都没有关闭有问题么?


如何马上关闭安全线程。如果用bool变量是很慢才把所有线程都关了

#7


upup

#8


use urldownloadtofile .

#9


楼上,,这个函数怎么更新一个网页

#10


每日一顶

#1


呵呵,

无人问津阿。。自顶一下。。

斑竹来帮帮忙了
。。

#2


别沉,在顶。。

大家看到的帮顶一下了。。。

问题解决就放分

#3


怎么都米有人看的...5555


#4


帮顶吧。!~

#5


没有来得及看你的程序.

你先把你的程序编译成Release模式的试试.

#6


写写。。release编译没有了内存错误但感觉肯定有问题~~


现在想要提升一些速度要怎么做。。 

 还有程序关闭。。线程都没有关闭有问题么?


如何马上关闭安全线程。如果用bool变量是很慢才把所有线程都关了

#7


upup

#8


use urldownloadtofile .

#9


楼上,,这个函数怎么更新一个网页

#10


每日一顶