K
kernelj
Unregistered / Unconfirmed
GUEST, unregistred user!
线程代码:
主程序代码:
问题描述,每执行一次扫描,就会增加几个线程,无法自动结束,知道关闭程序。请求帮助。另外我想把扫描到的ip一个一行的写入文件中,应该怎么做。感谢了。
代码:
unit Unit2;
interface
uses
Classes, SysUtils, Winsock, Windows,ExtCtrls,StdCtrls;
type
chkconn = class(TThread)
private
{ Private declarations }
strs:TStringList;
TmpMsgStr: TMemo;
Tmpip:string;
proceduredo
save;
//proceduredo
save1;
protected
procedure Execute;
override;
public
constructor Ctreate(ip:string;MsgStr: TMemo);
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure chkconn.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ chkconn }
var
CS: TRTLCriticalSection;
constructor chkconn.Ctreate(ip:string;MsgStr: TMemo);
//构造线程
begin
Tmpip := ip;
TmpMsgStr := MsgStr;
//strs.LoadFromFile(ExtractFilePath(Application.ExeName)+'server.ini');
InitializeCriticalSection(CS);
//初始化
FreeOnTerminate := True;
//删除
inherited Create(False);
//运行
end;
function Chkconn1(ip:string):Boolean;
var
MyClientSock:TSocket;
Socket5Proxy:TSockAddr;
MySocketBuf:array[0..256]of byte;
PcharSocketAddr:PChar;
Re:integer;
TempWSAData:TWSAData;
begin
Result:=false;
WSAStartup(MAKEWORD(2,0),TempWSAData);
MyClientSock:=socket(AF_INET,SOCK_STREAM,0);
if(MyClientSock<>INVALID_SOCKET) then
begin
ZeroMemory(@Socket5Proxy,sizeof(Socket5Proxy));
Socket5Proxy.sin_family := AF_INET;
GetMem(PcharSocketAddr,Length(ip)+1);
ZeroMemory(PcharSocketAddr,Length(ip)+1);
StrPCopy(PcharSocketAddr,ip);
Socket5Proxy.sin_addr.S_addr :=inet_addr(PcharSocketAddr);
FreeMem(PcharSocketAddr);
Socket5Proxy.sin_port := htons(StrToInt('3000'));
Re:=connect(MyClientSock,Socket5Proxy,sizeof(Socket5Proxy));
if Re <> SOCKET_ERROR then
Result:=true;
end;
closesocket(MyClientSock);
end;
procedure chkconn.dosave;
//var
//s: string;
begin
//s:=s+Tmpip+',';
//strs.CommaText:=s;
TmpMsgStr.Lines.Add(Tmpip);
end;
procedure chkconn.Execute;
begin
{ Place thread code here }
sleep(10);
EnterCriticalSection(cs);
if ChkConn1(Tmpip) then
Synchronize(dosave);
LeaveCriticalSection(CS);
FreeOnTerminate := True;
end;
end.
代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Winsock, Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Timer1: TTimer;
//procedure Timer1Timer(Sender: TObject);
//function Chkconn(ip:string):Boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
strss:Tstringlist;
i: integer;
ThreadScan: chkconn;
//定义线程变量
begin
strss:=Tstringlist.Create;
strss.LoadFromFile(ExtractFilePath(Application.ExeName)+'server.ini');
for i := 0 to strss.Count - 1do
begin
ThreadScan := chkconn.Ctreate(strss[i],Memo1);
sleep(10);
//挂起
end;
strss.Free;
//Timer1.Enabled:=true;
end;
end.