10线程的小问题 菜鸟向前辈求教(200分)

  • 主题发起人 主题发起人 xxzs2006
  • 开始时间 开始时间
X

xxzs2006

Unregistered / Unconfirmed
GUEST, unregistred user!
各位前辈好!诚心请教您多线程的写法 如果您有空 请指导一下 谢谢!
假设我做了一个函数
function TForm1.sq(n, p,IP: String): String;
那么怎么多线程同时执行这个函数 要求10线程以上 可否以我这个函数给个简单的演示例子.谢谢!
我用的方法是
type
Tv1 = class(TThread)
protected
procedure Execute;
override;
end;
type
procedure Tv1.Execute;
label 1;
var
...
begin
inherited;
...
end;

然后我写了10线程
procedure TForm1.Button1Click(Sender: TObject);
var
PT1:Tv1;
PT2:TV2;
PT3:Tv3;
PT4:TV4;
PT5:Tv5;
PT6:TV6;
PT7:Tv7;
PT8:TV8;
PT9:Tv9;
PT10:TV10;
begin
PT1:= Tv1.Create(False);
PT2:= Tv2.Create(False);
PT3:= Tv3.Create(False);
PT4:= Tv4.Create(False);
PT5:= Tv5.Create(False);
PT6:= Tv6.Create(False);
PT7:= Tv7.Create(False);
PT8:= Tv8.Create(False);
PT9:= Tv9.Create(False);
PT10:= Tv10.Create(False);
end;

我知道我这样写虽然实现了 但各位看了一定哈哈大笑 如何把我这些Tv1 Tv2 Tv3给科学化处理一下 降低代码量 请指导指导
 
以数组方式声明10个线程,然后用循环就行了吧,不知是不是你想的
 
谢谢cuit421指点,本人实在太菜,具体怎么处理,可否给个例子?只要实现10线程同时执行这个函数就好.
 
有个朋友这样指点我 但是他很忙 只说了一半:
线程内容是相同的 你创建三次就可以了。
如果有些参数不同 可以 重载 Create 函数。
constructor Create(APage : TObject;
Ai : integer);

//--- TPage_Thread -------------------------------------------------------------
constructor TPage_Thread.Create(APage : TObject;
Ai : integer);
begin
inherited Create(False);
FPage := APage;
FreeOnTerminate := True;
FThreadname := format(Page_Thread_ThreadName,[Ai]);
Threadstart;
end;

各位帮我看看谢谢了
 
我觉得你可以设计成有参数的线程TV…… .create(p1,p2,p……);
在执行时用for
for i:=0 to threadcountdo
begin
TV.create(p1,p2,p3);
end
我这么弄过 高手别笑话啊 指点一下
 
函数中用到了主窗体的控件了没有?还有处理了什么变量没有?
 
谢谢 xiaoyue_a 我的delphi学得到不全 多线程是在网络上找些文章看的 所以您的话我有些看不懂 可否写个更具体点的代码?
谢谢liyong0775,
谢谢杯中水:没有用到控件 也没有处理公共的变量
函数可以想象成这样
function TForm1.sq(n, p,IP: String): String;
begin
Result:='OK!';
end;

但是参数n p IP 是不停变的
各位前辈请踊跃发言,哪位给具可行的代码我马上发分,200分不要嫌少,从这我可以学到多线程知识,谢谢各位!
 
朋友在QQ上指点的这些,但是我听得一头雾水,原因是我基础差,我贴出来,也许对各位帮我解决问题有帮助 我自己也抓紧找些文章看理解多线程 但是如果各位能够帮我解决这个问题更加快更好啦,谢谢!
//---------------朋友在QQ上的指点

要写个公用函数,这个函数用来提n, p,IP信息,这个函数要用临界区实现同步~
实际呢 就是写个函数 在队列 或者别的办法里 获得一下这个线程,这次要扫描的对象。
InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection
DeleteCriticalSection
然后用这个同步。
 
楼主 我也是二把刀 哈哈 方便的话你可以和我qq 24826316
 
确实要看你具体实现的是什么函数,我认为用数组应该没问题,参数也可以用加进去。
我做了一个ping程序,就是同时ping不同ip地址,有50个吧,我为了不等待延时,就同时创建50个线程,4秒钟延时后完成所有任务。
我也是业余的,可以交流一下
qq:50051082
 
for i:=0 to 9do
PT1:= Tv1.Create(False);
 
要谢谢 cuit421 和 xiaoyue_a 两个人热心帮助 并提供了两份很好的代码 xiaoyue_a的代码我看不大懂 cuit421的代码我一看基本就懂了 分数代表心意 也谢谢所有回复的朋友
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部