Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2018, 19:55   #21
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
какие указатели?
Smart Pointer.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2018, 19:59   #22
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Кстати, там еще не завезли умные указатели что ли?
Увы, но пока нет. Есть костыль чисто для потоков в виде
TTask.Future - чтобы вернуть значение из потока.


Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
и еще интересно можно ли как то поймать завершение последнего потока?
ThreadPool.WaitAll;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.09.2018, 20:03   #23
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Smart Pointer.
я обычным то почти не пользуюсь ибо не разбирал его особо, а про смарт впервые узнаю. все мои познания в делфи взяты с этого и еще одного форума, плюс несколько статеек, ну и связывает это метод научного тыка, то есть пробовать разные варианты пока не заработает, после чего понять как оно работает и пытаться оптимизировать, но порой недостаток некоторых знаний не дает самостоятельно писать что то более сложное, с потоками к примеру знаком поверхностно и только вчера первый раз сделал более одного потока (не считая основного). и утечки памяти, out of memory первый раз пытаюсь исправить, раньше я даже память не чистил.. учусь по немногу в общем
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 20:14   #24
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
я обычным то почти не пользуюсь
Как это не пользуетесь? А .Create что вам возвращают?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2018, 20:21   #25
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как это не пользуетесь? А .Create что вам возвращают?
не собирал никуда то что возывщает этот конструктор, я их просто вызываю и все
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 20:26   #26
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

не знал? дарю

Код:
type
  TIPRange=record
  private
    CurrentIP,StopIP:cardinal;
    function IP2Cardinal(const IP:string):cardinal;
  public
    constructor Create(const Start,Stop:string);
    function GetNext(out Str:string):boolean;
  end;

{ TIPRange }
constructor TIPRange.Create(const Start, Stop: string);
begin
  CurrentIP:=IP2Cardinal(Start);
  StopIP:=IP2Cardinal(Stop);
end;

function TIPRange.IP2Cardinal(const IP: string): cardinal;
var
  IPRec:LongRec;
  Parts:TArray<string>;
begin
  Parts:=IP.Split(['.']);
  IPRec.Bytes[3]:=StrToInt(Parts[0]);
  IPRec.Bytes[2]:=StrToInt(Parts[1]);
  IPRec.Bytes[1]:=StrToInt(Parts[2]);
  IPRec.Bytes[0]:=StrToInt(Parts[3]);
  result:=cardinal(IPRec);
end;

function TIPRange.GetNext(out Str: string): boolean;
var IP:cardinal;
begin
  IP:=cardinal(TInterlocked.Increment(integer(CurrentIP)));
  result:=(IP<=StopIp);
  if result then
    Str:=IntToStr(LongRec(IP).Bytes[3])+'.'+IntToStr(LongRec(IP).Bytes[2])+'.'+
       IntToStr(LongRec(IP).Bytes[1])+'.'+IntToStr(LongRec(IP).Bytes[0])
  else
    Str:='';
end;
пользовать так
IPRange:=TIPRange.Create('192.168.0 .100','192.168.0.255');
while IPRange.GetNext(ips) do
....
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.09.2018, 20:30   #27
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Threading, System.Generics.Collections,System.SyncObjs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,IdIOHandler;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  TIPRange=record
  private
    CurrentIP,StopIP:cardinal;
    function IP2Cardinal(const IP:string):cardinal;
  public
    constructor Create(const Start,Stop:string);
    function GetNext(out Str:string):boolean;
  end;

{ TIPRange }
constructor TIPRange.Create(const Start, Stop: string);
begin
  CurrentIP:=IP2Cardinal(Start);
  StopIP:=IP2Cardinal(Stop);
end;

function TIPRange.IP2Cardinal(const IP: string): cardinal;
var
  IPRec:LongRec;
  Parts:TArray<string>;
begin
  Parts:=IP.Split(['.']);
  IPRec.Bytes[3]:=StrToInt(Parts[0]);
  IPRec.Bytes[2]:=StrToInt(Parts[1]);
  IPRec.Bytes[1]:=StrToInt(Parts[2]);
  IPRec.Bytes[0]:=StrToInt(Parts[3]);
  result:=cardinal(IPRec);
end;

function TIPRange.GetNext(out Str: string): boolean;
var IP:cardinal;
begin
  IP:=cardinal(TInterlocked.Increment(integer(CurrentIP)));
  result:=(IP<=StopIp);
  if result then
    Str:=IntToStr(LongRec(IP).Bytes[3])+'.'+IntToStr(LongRec(IP).Bytes[2])+'.'+
       IntToStr(LongRec(IP).Bytes[1])+'.'+IntToStr(LongRec(IP).Bytes[0])
  else
    Str:='';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  IPRange:TIPRange;
  i:integer;
begin
  IPRange:=TIPRange.Create('192.168.0.100','192.168.0.255');
  for i:=0 to 9 do
    TThread.CreateAnonymousThread(
      procedure
      var
        it:TIdTCPClient;
        ips:string;
      begin
        it := TIdTCPClient.Create(nil);
        try
          it.ConnectTimeout := 500;
          while IPRange.GetNext(ips) do
          begin
            if it.Connected then
              it.Disconnect(false);
            try
              it.Connect(ips,80);
              TThread.Synchronize(nil,procedure
              begin
                Memo1.Lines.Add(ips + ' YES');
              end);
            except
              TThread.Synchronize(nil, procedure
              begin
                Memo1.Lines.Add(ips + ' No');
              end);
            end;
          end;
        finally
          it.Free;
        end;
      end).Start;
end;

end.
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.09.2018, 20:39   #28
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
я их просто вызываю и все
...а потом вызываете Free.
Вот умные указатели и нужны чтоб не вызывать Free самому.

Вообще их вроде и самому можно реализовать в современных Дельфи.
http://delphisorcery.blogspot.com/20...in-delphi.html
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2018, 20:46   #29
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вообще их вроде и самому можно реализовать в современных Дельфи.
http://delphisorcery.blogspot.com/20...in-delphi.html
интересная статья, спасибо
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 20:47   #30
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Спасибо большое, постараюсь понять что конкретно делает этот код
PTyTb32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки Cpluser C# (си шарп) 1 28.10.2012 17:00
Потоки _Mixer_ Общие вопросы по Java, Java SE, Kotlin 4 16.10.2011 19:25
Потоки С++ Aleksin Помощь студентам 1 07.11.2010 18:15
потоки tanek Помощь студентам 6 15.03.2010 21:42