Здравствуйте, я сомневаюсь в критическом разделе. У меня есть два потока scannerThread и threader scannerchild.Code для Scannerthread упоминается ниже.Критический раздел в многопоточности для ip-сканера
procedure ScannerThread.Execute;
var
I: Integer;
ScannerCh: Array of ScannerChild;
IpList: TStringlist;
IPCount: Integer;
begin
IpList:=TStringList.Create;
IF GetNumberOfIpsInRange(Ip_From, Ip_To, IpList) then // Function call that returns iplist if TRUE
begin
Try
if Assigned(LvHosts) then // Clear
LvHosts.Clear;
IPCount := IpList.Count;
SetLength(ScannerCh, IPCount);
I := 0;
repeat
while GetTThreadsCount(GetCurrentProcessId) > tcount do // Tcount is threads to create which is given by user
Sleep(10);
ScannerCh[I]:=ScannerChild.Create(True, IpList[i]);
ScannerCh[I].FreeOnTerminate := True;
ScannerCh[I].LvHostname := LvHosts;
ScannerCh[I].Resume;
Inc(I);
until I = IPCount;
if Assigned(IpList) Then
FreeAndNil(IpList);
except
ShowMessage('Operation Failed');
If Assigned(IpList) Then
FreeAndNil(IpList);
end;
end else
ShowMessage('Invalid Range');
repeat
Sleep(100);
Until GetTThreadsCount(GetCurrentProcessId) = 2;
end;
Код для Scannerchild упоминается ниже
procedure ScannerChild.AddToList;
begin
ListItems1 := LVHostName.Items.Add;
ListItems1.Caption := IPToScan;
ListItems1.SubItems.Add(IPAddrToName(IPToScan));
end;
procedure ScannerChild.AddToList1;
begin
ListItems1:=LVHostName.Items.Add;
ListItems1.Caption := IPToScan;
ListItems1.SubItems.Add('No host found');
end;
procedure ScannerChild.Execute;
Var
ListItems1 : TListItem;
Hostname : String;
begin
Hostname := IPAddrToName(IPToScan);
if Hostname <> EmptyStr then
begin
Synchronize(AddToList);
end else
synchronize(AddToList1);
end;
Здесь я получаю выход, но это не сериализации. Как нить, которая создается сначала, сначала не отображается. если я ставлю диапазон IP 192.168.0.1 до 192.168.0.10, то я должен получить сериализованную выход в ListView как
192.168.0.1 hostname
192.168.0.2 hostname
192.168.0.3 hostname
.
.
192.168.0.10 hostname
Но я не получаю it.my выход приходит как
192.168.0.1 hostname
192.168.0.2 hostname
192.168.0.4 hostname
192.168.0.6 hostname
192.168.0.3 hostname
Так это потому что я не использую критический раздел? Nnd, если да, где я должен приобретать и покидать критический раздел, чтобы сначала созданный поток мог входить в критический раздел сначала и следующий поток следующим образом.
Похоже, ScannerChild обновляет элемент управления VCL. Вы не можете сделать это в потоке. –
Действительно, вы не можете получить доступ к элементам управления графическим интерфейсом вне основного потока. Кроме того, ваш дизайн не так. Вам действительно нужно отделить логику сканирования от графического интерфейса. –
nope есть основная форма, у которой есть эти темы –