关于多线程多任务的请教!

来源:互联网 发布:js点击按钮删除当前行 编辑:程序博客网 时间:2024/06/11 08:36

关于多线程多任务的请教!
作  者:  coldsea_2000 (张海) 
等  级:   
信 誉 值:  100
所属论坛:  VC/MFC 进程/线程/DLL
问题点数:  100
回复次数:  7
发表时间:  2002-05-23 14:57:15Z
  
 
  

各位大哥:
    小弟今日想做一个类似于网络蚂蚁一样的下载软件.我实现了多线程,但是多任务却不知道该如何实现?我想是不是按照任务的次序,把这些任务循环执行呢?还是要为任务本身的执行创建线程---也就是线程里面套线程?如果是线程里面套线程,那我该如何去做并且对多线程做好管理呢?谢谢各位不吝指教!

 
 
 
 回复人: kevin_qing() ( ) 信誉:103  2002-05-23 15:12:40Z  得分:100
 
 
 
可以这样:
每增加一个任务时, 界面线程生成一个任务管理线程。
任务管理线程负责生成/管理下载线程,以及和界面的交互。

另外如果为了更高的效率的话,可以对任务管理和下载线程分别做一个线程池,以减少系统开销
 
 
Top
 
 回复人: kevin_qing() ( ) 信誉:103  2002-05-23 15:14:44Z  得分:0
 
 
 
还可以在每个任务的下载线程中设置一个为主下载线程,它负责管理该任务的其他下载线程,flashget应该就是这么做的
 
 
Top
 
 回复人: coldsea_2000(张海) ( ) 信誉:100  2002-05-28 01:24:58Z  得分:0
 
 
 
To kevin_qing(大哥/大姐):
   小弟在每个任务中下载线程后,追加了一个其他的非下载线程,专门管理下载线程!  我把这个下载函数封装在一个类中,比如说:就是在CDownload中,CDownload中有个可供其他类调用的函数StartTask(CString URL),URL为资源地址;我原先以为在其他类中调用这个函数时,只要创建一个该类的局部变量,就可以实现多任务;但是事实上却不行!而全局的变量才可以,例如:CDownload dw;(dw为全局变量)   dw.StartTask(string);这样才可以下载!
   后来看了你的提示,我觉得如果为每个任务生成界面线程,但是怎么才能让这些界面看不见?我是用一个中间的dialog管理每个任务的!但是只能一个一个的进行下载;dialog聚焦时,点击其他的东西没用!如果用界面多线程,如何让dialog看不见?
而任务结束的时候自动销毁?谢谢!
                                                      小弟敬上!
 
 
Top
 
 回复人: Kevin_qing() ( ) 信誉:103  2002-06-01 11:40:55Z  得分:0
 
 
 
你大概没明白我的意思:)

我说的界面线程其实就是你的主窗口/dialog的消息循环。
假如你对每个任务都封装在一个对象里面,比如:

class CTask{
char URL[1024];
//....
}
DWORD WINAPI TaskThread(CDownload* task)
{
      HANDLE hThreads[32];
      for(int i=0;i<nThreadMax;i++)//nThreadMax是最大分块数
         hThreads[i]=_beginthreadex(DownloadThread,task,....);
      WaitForMultipleObjects(nThreadMax,hThreads,true,INFINITE);//等待任务结束
      for(i=0;i<nThreadMax;i++)
      {
        GetExitCodeThread(hThreads[i]);//处理任务返回值
        closehandle(hThreads[i]);
      }
      PostMessage(hWnd,...);//发送消息到主界面
     
}
DWORD WINAPI DownloadThread(CDownload* task)
{
 ..........
};

 

当主界面收到一个下载消息时,开始一个TaskThread线程。
下载结束时,下载线程会发送消息通知主界面

 
 
Top
 
 回复人: Kevin_qing() ( ) 信誉:103  2002-06-01 11:47:01Z  得分:0
 
 
 
其实这个可以只用单下载线程实现多连接的管理,不过程序很难写了
 
 
Top
 
 回复人: coldsea_2000(张海) ( ) 信誉:100  2002-06-06 15:22:49Z  得分:0
 
 
 
我生成了一个基于winthread的线程,按照界面线程生成的方法,实现了多任务的下载,谢谢 Kevin_qing()的提示!非常的感谢!
                                         小弟敬上!
 
 
Top
 
 回复人: lgx1916(浅叶绿子) ( ) 信誉:98  2002-06-06 17:54:30Z  得分:0
 
 
 
flag
 
 

原创粉丝点击