powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточный телнет
25 сообщений из 43, страница 1 из 2
Многопоточный телнет
    #39550561
aka777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
набросал минимальный примерчик, для пояснения сути вопроса:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, TrayIcon, Menus, ZAbstractConnection, ZConnection, StdCtrls,
 Buttons, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdTelnet, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, DateUtils;

type
 TMainForm = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure TimerTimer(Sender: TObject);
 private
   { Private declarations }
   IPList: TStringList;
   ThreadArray: array of TThread;
   PredScanTime: TDateTime;    
 public
   { Public declarations }
 end;

 TTelnetThread = class(TThread)
 private
   IdTelnet: TIdTelnet;
   PortNo: Integer;
   IP: String;
   LastPortText: String;
   procedure ParsePortText;
   procedure DataAvailable(Sender: TIdTelnet; const Buffer: String);
 protected
   procedure Execute; override;
 public
   constructor Create(IP: String);
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
 i,j: Integer;
begin
 IPList := TStringList.Create;
 IPList.LoadFromFile(ExtractFileDir(Application.ExeName)+'\IP.txt');

 PredScanTime := Now;
 SetLength(ThreadArray, IPList.Count);
end;

constructor TTelnetThread.Create(IP: String);
begin
 inherited Create(True);
 IP := IP;
 LastPortText := '';
end;

procedure TTelnetThread.DataAvailable(Sender: TIdTelnet; const Buffer: String);
begin
 LastPortText := LastPortText + Buffer;
end;

procedure TTelnetThread.ParsePortText;
begin
  1) Парсим текст
  2) Вставляем в базу
end;

{Стартуем потоки каждые 5 минут}
procedure TMainForm.TimerTimer(Sender: TObject);
var
 i: Integer;
begin
 if DateTimeToUnix(Now) > DateTimeToUnix(PredScanTime) + 300 {ScanInterval} then begin
    PredScanTime := Now;

    for i := 0 to Length(ThreadArray) - 1 do begin
      ThreadArray[i] := TTelnetThread.Create(IPList[i],PLList[i]);
      ThreadArray[i].FreeOnTerminate := True;
      ThreadArray[i].Priority := tpLower;
      ThreadArray[i].Resume;
    end;
 end;
end;

procedure TTelnetThread.Execute;
var
 i: Integer;
begin
 try
   IdTelnet := TIdTelnet.Create(nil);
   IdTelnet.OnDataAvailable := DataAvailable;
   IdTelnet.Host := IP;
   IdTelnet.Connect(-1);

   Sleep(2000);
   IdTelnet.Write('admin'+#13#10);
   Sleep(2000);
   IdTelnet.Write('admin'+#13#10);
 except

 end;

 try
   for i := 1 to 64 do begin
     LastPortText := '';
     PortNo := i;
     IdTelnet.Write('get port '+IntToStr(i)+' data'+#13#10);
     sleep(1500);

     Synchronize(ParsePortText);
   end;
 except

 end;

 IdTelnet.Free;
end;

end;

end.


Чем больше потоков, тем больше LastPortText = '', до 30 потоков все 30X(64порта) =1960 записей на месте. Дальше чем больше потоков тем больше пустых LastPortText в квадратичной прогрессии. В чем костыль? Как количесво потоков можем повлиять на то, что idTelnet не успевает вернуть ответ, если он сам же в отдельном потое? так же быть не должно.

Вобщем чем больше потоков тем больше я теряю данных, до 30 потоков не теряю ничего. Может проблема в самом idTelnet ?
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550655
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aka777,

а ничего, что Microsoft настоятельно рекомендует не использовать в программе потоков количеством более, чем число ядер процессоров в системе * 2? У тебя банально операционка не дает квантов времени на выполнение потокам
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550667
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2, народ ждёт чуда и свято верит в "чем больше - тем лучше"
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550756
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2aka777,

а ничего, что Microsoft настоятельно рекомендует не использовать в программе потоков количеством более, чем число ядер процессоров в системе * 2? У тебя банально операционка не дает квантов времени на выполнение потокам

А ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?

Марксизм не догма, а руководство к действию. (с)
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550766
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiА ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?
Порядок? На порядки. :)
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550777
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanschiА ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?
Порядок? На порядки. :)
На порядки в квадрате :)

И тем не менее проблема у ТС подтверждает, к чему приводит бездумное использование большого количества потоков.
А, и во всем конечно же виноват Билл Гейтс :)
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550801
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2На порядки в квадрате :)
А я не шучу.
У меня колонка с количеством потоков всегда перед глазами в процесс эксплоере.
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550813
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Технические подробности можно почитать здесь
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550821
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

ОС может позволить себе всё, что посчитает нужным, включая необходимое количество потоков в системных процессах. Однако для обычных приложений могут действовать иные правила, чем для системы. Не знаю, как в других ОС, но в виндах производитель ОС четко говорит, чего позволено черни
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550823
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger, народ и правда верит в чудо :-)
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550832
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Не знаю, как в других ОС, но в виндах производитель ОС четко говорит, чего позволено черни
Нет таких четких правил.
Вот в андроиде ОС четко говорит, что операции с сетью должны происходить вне основного потока и бьет по голове за нарушение.
Так что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологий.
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550835
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТак что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологийесли поток по большей части спит в ожидании события а не тупо циклит что-то то они и тысячами вполне себе мирно в одном процессе могут уживаться
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550837
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerТехнические подробности можно почитать здесь

А еще лучше здесь:
https://blogs.technet.microsoft.com/mark_russinovich/2009/11/02/windows-1080/
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550839
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня одного напрягло, что автор реализует диалоговое взаимодействие с сервером через Sleep(), вместо анализа ответов, а после этого тупо давит эксепшены? А потом не понимает почему что-то не работает и где затык?
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550844
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanwadmanТак что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологийесли поток по большей части спит в ожидании события а не тупо циклит что-то то они и тысячами вполне себе мирно в одном процессе могут уживаться
Это уже вопрос к программисту, что его поток делает, когда нужно ждать/спать.
ТС вон синхронизацией балуется и удивляется, что не работает...
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550848
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЭто уже вопрос к программисту, что его поток делает, когда нужно ждать/спатьну да. я к тому что в принципе никакого криминала наплодить потоков нет. не всегда это конечно будет ассоциировано со здравым смыслом и пойдет на пользу но тем не менее
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550850
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
 IP := IP;



"Красота-то какая..."
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550859
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aka777
Код: pascal
1.
Sleep(1500);

может слипов не хватает с увеличением кол-ва нитей. не знаток этого копонента, но может ReadLnWait вместо Sleep. хз
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550905
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiА еще лучше здесь:
https://blogs.technet.microsoft.com/mark_russinovich/2009/11/02/windows-1080/ Ну грубо говоря, в твоём чувак из Microsoft говорит о том когда и сколько всего винда позволяет создать потоков. А в моём чувак из Intel говорит почему избыток потоков накрывает медным тазом быстродействие и даёт рекомендации. Хз что ТС-у полезнее будет :)
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550930
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Ты сам-то статью по своей ссылке почитай, особенно в части Organizing Threads. Вообще, в статье говорится о том, что частое переключение контекста это плохо (кто-бы сомневался...), а у топикстартера мало того, что в потоках делается IO (а значит поток будет спать на объекте ожидания), так они ещё и тупо спят большую часть своей жизни. Таких потоков можно запустить столько, сколько в адресное пространство влезет. И дело уж точно не в квантовании, т.к. спящие потоки из планирования исключаются. О чём, кстати, в статье по твоей ссылке говорится.
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550943
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey - читал и что? Статья называется "Why Too Many Threads Hurts Performance, and What to do About It" и речь собсно об этом и идет. Где ты нашёл противоречие?
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39550968
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало прочитать название статьи, нужно ещё и саму статью...
Organizing ThreadsRunnable threads, not blocked threads, cause time-slicing overhead. When a thread blocks on an external event, such as a mouse click or disk I/O request, the operating system takes it off the round-robin schedule, so the thread no longer incurs time-slicing overhead. A program may have many more software threads than hardware threads, and still run efficiently if most of those software threads are blocked.
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39551002
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyМало прочитать название статьи, нужно ещё и саму статью...Пятничное уже началось? Я вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше". В упомянутой тобой главе "Organizing Threads", как раз первым делом и рекомендуется ограничить число работающих потоков: "A good solution is to limit the number of runnable threads to the number of hardware threads, and possibly limit it to the number of outer-level caches if cache contention is a problem.". Понятно что никто не мешает наплодить ещё туеву хучу спящих. Вопрос нужно ли?
PS: В работе TIdTelnet не использовал. Так что это безотносительно тонкости его работы
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39551024
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerЯ вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше"
Я бы не стал ничего писать, если бы твоя фраза содержала вот это "не всегда".

white_niggerВ упомянутой тобой главе "Organizing Threads", как раз первым делом и рекомендуется ограничить число работающих потоков: "A good solution is to limit the number of runnable threads to the number of hardware threads, and possibly limit it to the number of outer-level caches if cache contention is a problem."
Тут говорится о runnable потоках, а у ТС'а они, практически всегда, blocked (в терминолигии автора статьи). Если читать статью дальше, то можно увидеть, что речь вообще идёт об ограничении вычислительных (compute threads) потоков.

white_niggerПонятно что никто не мешает наплодить ещё туеву хучу спящих. Вопрос нужно ли?
Вопрос, нужно или нет, не стоит. По крайней мере в этом нет ничего криминального и проблемы ТС с этим не связаны.
...
Рейтинг: 0 / 0
Многопоточный телнет
    #39551059
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeywhite_niggerЯ вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше"
Я бы не стал ничего писать, если бы твоя фраза содержала вот это "не всегда".
Моя фраза:
white_niggerнарод ждёт чуда и свято верит в "чем больше - тем лучше"Где тут "всегда" или "не всегда"? А почему "не всегда" и как правильно - говорится в статье.
PS:
Короче не понял я к чему эта полемика поднялась. Весьма сомневаюсь, что нам нужно друг-другу про потоки рассказывать
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточный телнет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]