Delphi 多线程的一个代码如何写 100

我想通过使用idhttp来判断代理是否可用.下边是我的要求:1.将扫描整理后的代理IP加载到listbox内.(可以省略)2.通过button按钮来开启线程.最大线程数由... 我想通过使用idhttp来判断代理是否可用.下边是我的要求:
1.将扫描整理后的代理IP加载到listbox内.(可以省略)
2.通过button按钮来开启线程.最大线程数由edit1.text获得
3.线程内,动态创建idhttp,从listbox内获得代理IP和端口后,设置idhttp的代理
idhttp1.proxyparams.proxyserver:=ip; //这里是代理IP的地址
idhttp1.proxyparams.proxyport:=port; //这里是代理IP的端口
上边两项我可以自己从listbox中截取(可以省略)
在设置好idhttp代理后,使用tmp:=idhttp.get('http://www.163.com'),
如果发现相应的字符串,证明此代理IP可以使用,继而将结果存入Memo中.
如果没有发现相应的字符串,证明此代理IP不能使用,继而将结果也存入Memo中.

小弟看了好多多线程方面的例子,还是一头雾水,控制不好写入Memo和中间发生的冲突问题.
网上关于访问VCl的也不太多.有也是那些canvas的.
希望哪位高手朋友能抽出来点时间帮我写一下这个线程部分和开启多个线程的部分,还有当listbox内的代理IP检测完后
能够安全的释放线程.在这里谢谢了,先设置为100发吧.如果感觉可以的话.我再追求分数.
看不懂你的代码...哎!有没有简单一些的.最好是我说的这个例子
展开
 我来答
renzhumin2
2010-06-26 · TA获得超过163个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:274万
展开全部
前几天刚好有个客户叫我用DELPHI帮忙写个线程例子,给你看看

//主窗体
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
//线程列表,和Tlist差不多,多了一些多线程同步处理方法
GvThreadList : TThreadList;
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
GvThreadList := TThreadList.Create;
Label1.Caption := '线程数:';
Button1.Caption := '创建';
Button2.Caption := '停止';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,ICount : Integer;
MyLIst : TList;
MyRcThread : RcThread;
begin
ICount := StrToInt(edit1.Text);
//这里不用MyList也一样,可以直接用GvThreadList.Add(P),让学习者有个LockList方法
MyList := GvThreadList.LockList;
for i :=0 to ICount-1 do
begin
MyRcThread := RcThread.Create(false,memo1,'线程编号:'+IntTostr(i));
//将所创建的线程添加到列表中,方便管理
MyList.Add(MyRcThread);

end;
GvThreadList.UnlockList;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
MyLIst : TList;
MyRcThread : RcThread;
begin

//多个地方同时访问一个列表时,可以用ThreadList的线程锁方法(临界),避免多线程访问变量导致变量取值出错
MyList := GvThreadList.LockList;
for i := 0 to Mylist.Count -1 do
begin
MyRcThread:=MyList[0];
MyRcThread.Terminate;
Mylist.Delete(0);

end;
MyList.Clear;
//解锁
GvThreadList.UnlockList;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2.Click;
GvThreadList.Free;
end;

end.

//线程单元
unit Unit2;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

//定义线程,简单的举例如何创建/调用线程,
type
RcThread = class(TThread)
private
procedure RefreshMainForm;
public
MyCount: integer ;
MyThreadTally : string;
Mymemo : Tmemo;
//创建参数:线程是否挂起,MEMO,线程标记
constructor Create(CreateSuspended:Boolean;memo:Tmemo;ThreadTally:String);reintroduce;
destructor Destroy(); override;
protected
procedure Execute(); override;
end;

implementation

uses Unit1;

{ RcThread }

//创建
constructor RcThread.Create(CreateSuspended: Boolean;memo:Tmemo;ThreadTally:String);
begin
MyCount := 0;
Mymemo := memo;
MYThreadTally :=ThreadTally;
inherited Create(CreateSuspended);
end;
//释放
destructor RcThread.Destroy;
begin
MyMemo.Lines.Add(MyThreadTally+'释放');
inherited;
end;
//执行
procedure RcThread.Execute;
begin
while True do
begin
//停止,可以根据自己要判断的条件去判断(if....then break;)
if (self.Terminated = true) then
Free;

//线程每15豪秒执行一次,以免过多占用CPU
sleep(15);
//同步
Synchronize(RefreshMainForm);
end;

end;

procedure RcThread.RefreshMainForm;
begin
//简单举例,往传递的MEMO中写当前线程执行了第几次
Inc(MyCount);
Mymemo.Lines.Add(MyThreadTally+' 执行第'+IntToStr(MyCount)+'次');
Application.ProcessMessages;

end;
end.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式