📄 searchhosts.pas
字号:
unit SearchHosts;
interface
uses Windows, Messages, SysUtils, Classes,ComCtrls,Dialogs;
type
TSearchHostsThread=class(TThread)
private
StartNum, HostIndex, ImageIndex: integer;
tnode: TTreeNode;
HostName, MyGroup: string;
TotalHostNum: integer;
protected
procedure Execute; override;
procedure GetTreeInfo;
//Procedure SetNode;
public
ParentNode: TTreeNode;
//ParentTree: TTreeView;
end;
THostsThread=class(TThread)
private
TotalHostNum: integer;
protected
procedure Execute; override;
Procedure EndSearch;
public
BeginNum: integer;
ParentNode: TTreeNode;
//ParentTree: TTreeView;
MyToolBtn: TToolButton;
end;
implementation
uses main,SearchHostThreadUnit;
procedure TSearchHostsThread.GetTreeInfo;
begin
with MainForm do
begin
ImageIndex := ParentNode.Item[HostIndex].ImageIndex;
tnode := ParentNode.Item[HostIndex];
HostName := tnode.Text;
MyGroup := (PMyTreeItem(tnode.Data)).Group;
end;
end;
procedure TSearchHostsThread.Execute;
var
i : integer;
searchers : array[1..100]of TSearchHostThread;
bDo : array[1..100]of boolean;
begin
TotalHostNum := ParentNode.Count;
for i:=1 to 100 do bDo[i]:=false;
for i:=1 to ThreadNum do
begin
//if stop then exit;
if terminated then exit;
if StartNum+i<TotalHostNum then
begin
HostIndex:=StartNum+i;
synchronize(GetTreeInfo);
if (ImageIndex = 7)or(ImageIndex = 15) then
begin
if terminated then exit;
//Synchronize(AddGroup);
if terminated then exit;
bDo[i]:=true;
searchers[i]:=TSearchHostThread.create(true);
//searchers[i].MyGroup := GroupName;
searchers[i].MyTree := TTreeView(ParentNode.TreeView);
searchers[i].MyNode := tnode;
searchers[i].MyNode.ImageIndex := 12;
searchers[i].MyNode.SelectedIndex := 12;
//Synchronize(SetNode);
searchers[i].MyHost := HostName;
searchers[i].MyGroup := MyGroup; //'unknown';
searchers[i].FreeOnTerminate := true;
//searchers[i].hFlag := CreateEvent(nil,true,false,pchar(HostName));
//ResetEvent(searchers[i].hFlag);
searchers[i].Resume;
//if threadMode=0 then searchers[i].WaitFor; //单线程
end;
end else exit;
end; //end of for
//if threadMode=1 then
//begin
for i:=1 to ThreadNum do
if bDo[i] and (searchers[i]<>nil) then
begin
//if not searchers[i].Terminated then
begin
{if OS <> osWinxp then searchers[i].WaitFor else} WaitForSingleObjectEx(searchers[i].Handle,INFINITE,true);
{if ver>4 then
begin
searchers[i].Terminate;
searchers[i].free //win98下free会出错。
end
else //searchers[i].Terminate;
TerminateThread(searchers[i].handle,0);}
end;
end;
//Synchronize(AddGroup); ///
//end;
end;
procedure THostsThread.EndSearch;
begin
with MainForm do
begin
//ToolBtnStop.Enabled := false;
//ToolBtnPause.Enabled := false;
//ToolBtnAuto.Enabled := true;
//Timer1.Enabled := false;
if assigned(MyToolBtn) then MyToolBtn.Enabled := true;
end;
end;
procedure THostsThread.Execute;
var
i : integer;
Multisearcherhost : TSearchHostsThread;
begin
TotalHostNum := ParentNode.Count;
i := BeginNum;
repeat
if stop then exit;
if terminated then exit;
Multisearcherhost:=TSearchHostsThread.create(true);
Multisearcherhost.StartNum := i;
Multisearcherhost.FreeOnTerminate := true;
Multisearcherhost.ParentNode := ParentNode;
Multisearcherhost.Resume;
//Multisearcherhost.WaitFor;
WaitForSingleObjectEx(Multisearcherhost.Handle,{INFINITE}10000,true);
i:=i+ThreadNum;
//SearchProgress:=i; //timer
until i>= TotalHostNum;
synchronize(EndSearch);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -