真实的RMB求教使用线程池[不开玩笑]

l12555712 2009-06-18 09:30:27
先说明。我这个线程是网上找的。具体你可以先看看。。如果有能力的话或者有信心的话跟我说一下。。
具体地址:http://download.csdn.net/source/1004776 或 http://blog.csdn.net/babyvspp/archive/2008/01/01/2008234.aspx

本人学习delphi有半年多了。最近老师让我们全部学员都做一个线程池模板。我实在做不出来。然后看到卢伟大哥写的。然后自己拿回来按照他上面说的调试了一下但是最终没成功。所以想请一个网上老师指导一下。。有偿服务的。大概50-100一节课这样的价格能接受!!....具体我们再好好谈谈!!
...全文
180 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbgchen 2011-06-30
  • 打赏
  • 举报
回复
mark
byyouxin 2010-03-02
  • 打赏
  • 举报
回复
引用 15 楼 genispan 的回复:
cnpack组件包中含有线程池单元(CnThreadPool.pas)、在该组件包中也含有一个线程池使用的 demo, 该 demo 可以通过监听端口,接受线程池发送的 TCP 请求信息。发送请求信息时,是可以通过设置参数,按照一定的时间间隔发送请求,这些请求信息会被添加到队列中,由线程池中的线程执行,按照 CnThreadPool 实现单元的介绍,是可以通过设置相关参数控制线程池中的最少线程数量和最多线程数量,我现在的问题是:如何可以控制线程池中线程的执行时间间隔,比如线程池中目前保持有两个线程A、线程B,我希望能够控制这两个线程的执行时间间隔,因为在向某些服务器请求信息时,如果请求的时间间隔太短(或在短时间内并发请求的线程过多,就会受到服务器的暂时拒接),我希望通过调节线程池中线程之间的执行时间间隔而达到与服务器和谐的目的。在 CnThreadPool 线程池实现单元中,相关参数如下:

  TCnTaskDataObject -- 线程池线程处理数据的封装
    线程池中的线程处理任务所需的数据的基类
    一般情况下,要实现某种特定的任务就需要实现相应的一个
  从该类继承的类
    Duplicate -- 是否与另一个处理数据相同,相同则不处理
    Info -- 信息,用于调试输出

  TCnPoolingThread -- 线程池中的线程
    线程池中的线程的基类,一般情况下不需要继承该类就可以
  实现大部分的操作,但在线程需要一些外部环境时可以继承该
  类的构造和析构函数,另一种方法是可以在线程池的相关事件
  中进行这些配置
    AverageWaitingTime -- 平均等待时间
    AverageProcessingTime -- 平均处理时间
    Duplicate -- 是否正在处理相同的任务
    Info -- 信息,用于调试输出
    IsDead -- 是否已死
    IsFinished -- 是否执行完成
    IsIdle -- 是否空闲
    NewAverage -- 计算平均值(特殊算法)
    StillWorking -- 表明线程仍然在运行
    Execute -- 线程执行函数,一般不需继承
    Create -- 构造函数
    Destroy -- 析构函数
    Terminate -- 结束线程

  TCnThreadPool -- 线程池
    控件的事件并没有使用同步方式封装,所以这些事件的代码
  要线程安全才可以
    HasSpareThread -- 有空闲的线程
    AverageWaitingTime -- 平均等待时间
    AverageProcessingTime -- 平均计算时间
    TaskCount -- 任务数目
    ThreadCount -- 线程数目
    CheckTaskEmpty -- 检查任务是否都已经完成
    GetRequest -- 从队列中获取任务
    DecreaseThreads -- 减少线程
    IncreaseThreads -- 增加线程
    FreeFinishedThreads -- 释放完成的线程
    KillDeadThreads -- 清除死线程
    Info -- 信息,用于调试输出
    OSIsWin9x -- 操作系统是Win9x
    AddRequest -- 增加任务
    RemoveRequest -- 从队列中删除任务
    CreateSpecial -- 创建自定义线程池线程的构造函数
    AdjustInterval -- 减少线程的时间间隔
    DeadTaskAsNew -- 将死线程的任务重新加到队列
    MinAtLeast -- 线程数不少于最小数目
    ThreadDeadTimeout -- 线程死亡超时
    ThreadsMinCount -- 最少线程数
    ThreadsMaxCount -- 最大线程数
    OnGetInfo -- 获取信息事件
    OnProcessRequest -- 处理任务事件
    OnQueueEmpty -- 队列空事件
    OnThreadInitializing -- 线程初始化事件
    OnThreadFinalizing -- 线程终止化事件

学习了我也来试试!
wh5280 2009-06-21
  • 打赏
  • 举报
回复
我对英文不熟,其它还行
walllacecn 2009-06-19
  • 打赏
  • 举报
回复
给每一个创建的线程编号,挂起,执行中,死锁,完成,销毁每个状态进行标示,用LIST就可以管理,不知道这样理解对不
outou 2009-06-19
  • 打赏
  • 举报
回复
一起努力吧
l12555712 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liangpei2008 的回复:]
如果LZ不清楚的话,CNPACK中有一个封装好的线程池组件,这个比较简单,先知道怎么用,再看源码
[/Quote]

嗯!!你的提示后我去看过了。在使用着。。
genispan 2009-06-19
  • 打赏
  • 举报
回复
cnpack组件包中含有线程池单元(CnThreadPool.pas)、在该组件包中也含有一个线程池使用的 demo, 该 demo 可以通过监听端口,接受线程池发送的 TCP 请求信息。发送请求信息时,是可以通过设置参数,按照一定的时间间隔发送请求,这些请求信息会被添加到队列中,由线程池中的线程执行,按照 CnThreadPool 实现单元的介绍,是可以通过设置相关参数控制线程池中的最少线程数量和最多线程数量,我现在的问题是:如何可以控制线程池中线程的执行时间间隔,比如线程池中目前保持有两个线程A、线程B,我希望能够控制这两个线程的执行时间间隔,因为在向某些服务器请求信息时,如果请求的时间间隔太短(或在短时间内并发请求的线程过多,就会受到服务器的暂时拒接),我希望通过调节线程池中线程之间的执行时间间隔而达到与服务器和谐的目的。在 CnThreadPool 线程池实现单元中,相关参数如下:

TCnTaskDataObject -- 线程池线程处理数据的封装
线程池中的线程处理任务所需的数据的基类
一般情况下,要实现某种特定的任务就需要实现相应的一个
从该类继承的类
Duplicate -- 是否与另一个处理数据相同,相同则不处理
Info -- 信息,用于调试输出

TCnPoolingThread -- 线程池中的线程
线程池中的线程的基类,一般情况下不需要继承该类就可以
实现大部分的操作,但在线程需要一些外部环境时可以继承该
类的构造和析构函数,另一种方法是可以在线程池的相关事件
中进行这些配置
AverageWaitingTime -- 平均等待时间
AverageProcessingTime -- 平均处理时间
Duplicate -- 是否正在处理相同的任务
Info -- 信息,用于调试输出
IsDead -- 是否已死
IsFinished -- 是否执行完成
IsIdle -- 是否空闲
NewAverage -- 计算平均值(特殊算法)
StillWorking -- 表明线程仍然在运行
Execute -- 线程执行函数,一般不需继承
Create -- 构造函数
Destroy -- 析构函数
Terminate -- 结束线程

TCnThreadPool -- 线程池
控件的事件并没有使用同步方式封装,所以这些事件的代码
要线程安全才可以
HasSpareThread -- 有空闲的线程
AverageWaitingTime -- 平均等待时间
AverageProcessingTime -- 平均计算时间
TaskCount -- 任务数目
ThreadCount -- 线程数目
CheckTaskEmpty -- 检查任务是否都已经完成
GetRequest -- 从队列中获取任务
DecreaseThreads -- 减少线程
IncreaseThreads -- 增加线程
FreeFinishedThreads -- 释放完成的线程
KillDeadThreads -- 清除死线程
Info -- 信息,用于调试输出
OSIsWin9x -- 操作系统是Win9x
AddRequest -- 增加任务
RemoveRequest -- 从队列中删除任务
CreateSpecial -- 创建自定义线程池线程的构造函数
AdjustInterval -- 减少线程的时间间隔
DeadTaskAsNew -- 将死线程的任务重新加到队列
MinAtLeast -- 线程数不少于最小数目
ThreadDeadTimeout -- 线程死亡超时
ThreadsMinCount -- 最少线程数
ThreadsMaxCount -- 最大线程数
OnGetInfo -- 获取信息事件
OnProcessRequest -- 处理任务事件
OnQueueEmpty -- 队列空事件
OnThreadInitializing -- 线程初始化事件
OnThreadFinalizing -- 线程终止化事件
genispan 2009-06-19
  • 打赏
  • 举报
回复
cnpack下载地址:
http://download.csdn.net/down/225549/tanm123
l12555712 2009-06-18
  • 打赏
  • 举报
回复
真的没有人能帮忙吗!!
l12555712 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 unsigned 的回复:]
线程池可以参考:http://topic.csdn.net/u/20080527/12/ab4518d9-979f-468d-bdb5-8638b504de7a.html
其中前面是通过自己写的代码实现,相对比较复杂,个人不是很推荐。8楼是通过使用Windows自带的线程池模型实现。

其实线程池没有想象中的那么复杂。最为简单的就是一个任务队列,能够保证加入任务和取得任务时不产生访问(入队/出队)冲突,然后有多个线程同时从该队列当中了出任务来执行。如此就可以通过CritialSection等…
[/Quote]
上面的大哥你给的地址里面的代码没有一个实例操作而且全是英文。我是一个菜鸟实在看不懂你上面的指的意思。。如果你有时间的话。请给我上一课吧。。
僵哥 2009-06-18
  • 打赏
  • 举报
回复
线程池可以参考:http://topic.csdn.net/u/20080527/12/ab4518d9-979f-468d-bdb5-8638b504de7a.html
其中前面是通过自己写的代码实现,相对比较复杂,个人不是很推荐。8楼是通过使用Windows自带的线程池模型实现。

其实线程池没有想象中的那么复杂。最为简单的就是一个任务队列,能够保证加入任务和取得任务时不产生访问(入队/出队)冲突,然后有多个线程同时从该队列当中了出任务来执行。如此就可以通过CritialSection等解决线程的访问冲突,至于怎么让工作线程(Worker Thread)知道有任务在队列当中,可以通过信号量(Semaphore)来控制。

在Windows平台当中不管是从开发的效率还是程序执行效率还是封装性来看,个人都推荐使用完成端口,即示例代码当中那样。也就是只需要5/6楼的完成端口类代码,创建一个全局的TIOCP实例,所有投递任务的线程调用PostQueuedCompletionStatus,让所有工作线程通过调用完成端口的GetQueuedCompletionStatus,其中都有lpBytesTransferred:Cardinal,dwCompletionKey: Cardinal,lpOverlapped:POverlapped壹壹对应,前面两个是4字节的参数,你可以传任意包括float、Integer、LongWord、LongInt等四字节的参数,也可以传任意的指针,后是也是一个指针参数,跟前两者一样,只不过个人更推荐使用它的原型,那样就只需要你对Overlapped结构进行扩充就可以完成任意个参数的传递。建议的做法是通过其中一个参数传入一个TWorkder类,给TWorker类加入必要的属性和方法,最好是一个抽象类,只抽象一个比如Run方法,如此你的线程池只需要拿到它之后调用该方法即可。具体的业务都可以由TWorker进行派生,并实现Run方法即完成了一个完整的线程池模板。
l12555712 2009-06-18
  • 打赏
  • 举报
回复
一起研究总可以吧
kim53622744 2009-06-18
  • 打赏
  • 举报
回复
惭愧,我也想教你,但是我也不会。哈哈,学习中~
僵哥 2009-06-18
  • 打赏
  • 举报
回复
缺乏基础的话,很难引导。即使是一个现成的示例也至少需要看得懂。再怎么也不能把仅仅只是代码的东西认为是一长串的英文。
l12555712 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 willflyz 的回复:]
这年头RMB都不值钱了,还是自己研究吧
[/Quote]

要是能研究出来我就不用在这里让别人带进门了。。
willflyz 2009-06-18
  • 打赏
  • 举报
回复
这年头RMB都不值钱了,还是自己研究吧
l12555712 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 de410 的回复:]
看看这一篇
http://blog.csdn.net/babyvspp/archive/2008/01/01/2008234.aspx
[/Quote]
我在上面写的就是这一章问题。在过程一开始创建时就出错了。希望有哪能给我上一节课。钱百分百给你付清!!!

[Quote=引用 8 楼 liangpei2008 的回复:]
如果LZ不清楚的话,CNPACK中有一个封装好的线程池组件,这个比较简单,先知道怎么用,再看源码
[/Quote]
有发个地址吗!!下载地址找不到
liangpei2008 2009-06-18
  • 打赏
  • 举报
回复
如果LZ不清楚的话,CNPACK中有一个封装好的线程池组件,这个比较简单,先知道怎么用,再看源码
de410 2009-06-18
  • 打赏
  • 举报
回复
l12555712 2009-06-18
  • 打赏
  • 举报
回复
这年头白问没有说。想真心请教几个问题也没有人愿意说!而且是有偿的都不愿意干。看来是个个人都发大财了还是说论坛人气少了。

830

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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