关于线程队列的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 link_delphi
  • 开始时间 开始时间
L

link_delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的应用程序有很多任务要执行,每一个任务占一个程,但考虑到服务器资源问题,我只能允许10个线程同时执行,所有任务是每隔一定的时间执行一次,并且每启动一个线程时需要判断一下当前正在执行的线程中是否已存在对应此任务的线程,如果有则将此任务加入一个队列,直到正在执行此任务的线程结束后再启动此任务,这样不停的循环执行,但本人一直没有找到合适的解决方法,请各位高手指点!
(我的线程是执行结束后自动释放,因为每个任务执行的内容是不同的)
 
我的应用程序有很多任务要执行,每一个任务占一个程,但考虑到服务器资源问题,我只能允许10个线程同时执行,所有任务是每隔一定的时间执行一次,并且每启动一个线程时需要判断一下当前正在执行的线程中是否已存在对应此任务的线程,如果有则将此任务加入一个队列,直到正在执行此任务的线程结束后再启动此任务,这样不停的循环执行,但本人一直没有找到合适的解决方法,请各位高手指点!
(我的线程是执行结束后自动释放,因为每个任务执行的内容是不同的)
 
你已经把你的思想都说出来了啊,就按着个做啊。给你个参考。定义一个这样的线程数组
TMainThread = class(TThread)
private
FMyExecute: TNotifyEvent;
public
procedure Execute;
override;
property MyExecute: TNotifyEvent read FMyExecute write FMyExecute;
end;
把你要执行的方法赋值给这个属性就行了。然后运行这个线程。你可以给这个属性赋不同的值,就可以执行不同的方法了。(可以根据需要再加别的属性)
 
能不能说的具体点,我怎样调用这个事件属性?
 
各位高手,请指点,谢谢了!
 
tasklist:TList;//定义一个任务队列
TTaskRec =Record
ID :Integer;
// 任务唯一标示
RuningFlag:boolean;//正在执行标志
xxx:String;//需要执行的任务
end;
//你可以让10个线程不停的运行不终止,也可以根据情况产生线程
在线程中
procedure TXXXXXX.Execute;
var
task:TTaskRec;
i:integer;
begin
while not Terminateddo
begin
if tasklist.Count<=0 then
begin
//没有任务时等待
Sleep(10);
Continue;
end;
For i:=0 to tasklist.Count-1do
begin
task:=tasklist.item;
if task.Runing then

begin
//已经在执行,则返回继续判断下一个
Sleep(10);
continue;
end;
task.Runing:=true;
//这里执行你的任务
//执行完成后从队列中删除,要注意线程保护这个任务的删除,添加操作
tasklist.delete;
break;//跳出这个任务循环
end;
end;
end;
 
我的线程中用的是BDE,但按yanghai0437的方法试过后总是报一个错误:
Name not unique in this context
 
几点建议:
1、创建一个任务监控线程,来管理10个任务线程的创建、运行。
2、10个任务线程放入任务队列中,监控线程根据有无任务需要执行和任务队列是否满额来动态的创建新任务线程,并加入队列。
3、每种任务制订一个任务标识,保存任务队列中所有任务的任务标识,如果有相同任务需要执行,便加入此任务标识所在的线程。
4、操作任务队列注意用临界区或其他措施保护。
 
to火山大哥:
你已经把你的思想都说出来了啊,就按着个做啊。给你个参考。定义一个这样的线程数组
TMainThread = class(TThread)
private
FMyExecute: TNotifyEvent;
public
procedure Execute;
override;
property MyExecute: TNotifyEvent read FMyExecute write FMyExecute;
end;
把你要执行的方法赋值给这个属性就行了。然后运行这个线程。你可以给这个属性赋不同的值,就可以执行不同的方法了。(可以根据需要再加别的属性)
能解释一下吗?我是新手object pascal不行。看的晕晕的,但又真的想学。正在看英文帮助文档。多线程那部分真的把我搞晕了。主要是object pascal不行。线程中怎么调用别的函数。哎,我的excute函数中的那个synchronize 大得我都怕!!但拆分成函数又不懂怎么同步,好象有几个兄弟也是跟我一个说法。象你说的property MyExecute: TNotifyEvent read FMyExecute write FMyExecute;
这是啥跟啥呀。晕,发现比学C还晕。
 
Name not unique in this context??
可能是你的数据控件的名称相同了,在不同的线程中要用不同的组件
 
HOHO,建议楼主还是先找几个多线程的范例看看,多线程涉及到的东西较多,没有基础是不行的。
 
to nicai_wgl:
请问在哪儿有关于线程队列处理的例子,
我的邮箱:asanhu@tom.com。先谢谢了
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3067266
{
我看了一下Delphi9,其Demo里也有如上我所说的那个3线程3方法排序的Demo,楼主参考一下其是如何同步的,就是靠ThreadDone
}
procedure TThreadSortForm.ThreadDone(Sender: TObject);
begin
Dec(ThreadsRunning);
if ThreadsRunning = 0 then
begin
StartBtn.Enabled := True;
ArraysRandom := False;
end;
end;
 
后退
顶部