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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi 多线程的一个代码如何写相关的知识,希望对你有一定的参考价值。

我想通过使用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发吧.如果感觉可以的话.我再追求分数.
看不懂你的代码...哎!有没有简单一些的.最好是我说的这个例子

参考技术A 前几天刚好有个客户叫我用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.

qt中如何实现多线程?

函数A()每隔两秒执行一次,函数B()每隔三秒执行一次,函数C()每隔四秒执行一次,同时每个函数都能控制另外两个函数的开始与停止。该如何实现?
因为我是初学者,所以代码越简洁越少越好,不要出现无关代码。但讲解越详细越通俗易懂越好,最好每一行代码都解释一下。

QT线程是独立的类:

在QT中添加C++类,头文件引用#include <QThread>;类公开,这样写:
class XXXX:public QThread,类里面申明Q_OBJECT,直接写在里面。signals: XXX();这是你的订阅事件名。private:void run();这是run函数;public: int cona=3;这是变量,一定要public。

cpp文件里引用头文件,run函数里面写方法:

void XXXX::run()

do

msleep(cona);
emit connec();
while(true);


上面就是线程类了。现在我们在窗体中应用,先在头文件申明
头文件private: XXXX *thread1;XXXX *thread2;
构造函数中初始化他们
thread1=new XXXX();
thread1->cona=3;
QObject::connect(thread1,SIGNAL(connec()),this,SLOT(XXX信号1()));
thread2=new XXXX();
thread2->cona=4;
QObject::connect(thread2,SIGNAL(connec()),this,SLOT(XXX信号2()));
XXX信号1()是读A数据,XXX信号2()读B数据。
按钮1的信号槽里写方法同时进行每3秒读A、没4秒读B
thread1->start();
thread2->start();
要结束谁就用 xxxx->terminate();

看明白没?QT可不同与C++,你不熟悉编程环境,是很难理解的。
参考技术A 你需要加深对网络编程基本概念的理解。
首先server端用于监听的是一个socket,每次有传入连接,就会有一个新的socket描述符产生,与客户端交互就是通过这个socket描述符。
如果使用 QTcpServer,你应该重写 incomingConnection() 函数,该函数可以拿到 socket 描述符,然后你使用自定义事件将这个socket描述符传递给一个线程,在这个线程中使用这个socket描述符来与客户端通信。这就是“通知+多线程”的服务器编程模型,Qt 中天生支持这种模型,很容易实现。
参考技术B 继承一个多线程类,在run里边写自己的函数,然后就行了追问

我需要完整的代码,谢谢

追答

代码要自己写,没人会给你

以上是关于Delphi 多线程的一个代码如何写的主要内容,如果未能解决你的问题,请参考以下文章

如何设置线程优先级 delphi

用python写多线程

C++11 中的读/写多线程

利用requestbeautifulsoupxml写多线程爬虫

delphi 多线程问题

delphi 多线程 loading界面