Текущий архив: 2004.11.14;
Скачать: CL | DM;
ВнизДемо сканирования сети, нужна помощь с тестированием... Найти похожие ветки
← →
Rouse_ © (2004-10-13 20:29) [0]Если кому не трудно, протестируйте пожалуйста программку...
http://rouse.front.ru/1.rar (качалками не качается, придется через браузер). 18 Кб.
Там исходники.
Программа сканирует сеть на наличие ресурсов (NetShareEnum) создавая поток на каждый адрес из диапазона адресов (необходима ОС из линейки NT) ...
Мне не понравилось как она повела себя на рабочем компьютере, а именно времени на создание потоков (255) было затрачено около 8 секунд...
Ерунда какаято...
На домашнем все в ажуре работает...
Особенно интересны результаты тестирования в доменной сети...
Зарание спасибо...
← →
DVM © (2004-10-13 20:59) [1]Работает в домене. Но при попытке вписать адреса от 192.168.0.200 до 192.168.0.1 вылетело исключение, что-то там с диапазоном прогрессбара.
Работает и под юзером и под админом.
← →
Rouse_ © (2004-10-13 21:03) [2]Интересует временный промежуток с нажатия кнопки до начала появления полоски в прогресбаре...
Диапазон (так как демо) по умолчанию должен различаться только последним байтом. т.е. первые 3 байта должны быть одинаковы...
к примеру
1.2.3.Х
и
1.2.3.Y
← →
Rouse_ © (2004-10-13 21:06) [3]А, ну и естьественно, различаться по возрастающей ;)
← →
DVM © (2004-10-13 21:09) [4]
> Интересует временный промежуток с нажатия кнопки до начала
> появления полоски в прогресбаре...
от 0 до 1 сек. Очень быстро.
Все сканирование на 50 машин заняло секунд 15-20.
← →
Adder © (2004-10-13 21:09) [5]Интересует временный промежуток с нажатия кнопки до начала появления полоски в прогресбаре...
Практически сразу (меньше секунды). В домене.
← →
Rouse_ © (2004-10-13 21:21) [6]Странно, очень странно, я думал что что-то не так, но тогда объясните мне плз, в чем может быть проблема в следующем коде: ?
for I := AFrom to ATo do
with TScanThread.Create(False) do
begin
IP := inet_addr(PChar(Prefix + IntToStr(I)));
FreeOnTerminate := True;
Resume;
end;
Я сегодня замерял через GetTickTime диапазон запуска потока (при данных по умолчанию) распределяется примерно так:
первые 5 потоков одновременно
вторые 6 - 7 через 15-20 м.сек
остальные с промежутком в 10-150 мсек...
Очень странно...
Просто это одна из последних заготовок к статье и не хотелось бы делать ошибки...
← →
Rouse_ © (2004-10-13 21:22) [7]Замерял в смысле на проблемной машине, где все сканирование начинается через сек 8 - 10 после нажатия кнопки...
← →
jack128 © (2004-10-13 21:23) [8]у меня бобик сдох. Завис вчистую. Надеюсь, то что я закоментировал
procedure TScanThread.Execute;
begin
// inherited;
Synchronize(IncCount);
Scan;
Synchronize(DecCount);
end; не очень повлияло на результат? ;-)
← →
Jel © (2004-10-13 21:24) [9]Сканирование начинает практически сразу. Без домена. Нашла только мой компьютер. Остальные не увидела. В сетевом окружении остальные видны.
← →
jack128 © (2004-10-13 21:24) [10]Rouse_ © (13.10.04 21:21) [6]
в этом коде проблемы точно нет. он сам по себе выполняется на 60мсек.
← →
Rouse_ © (2004-10-13 21:29) [11]> [9] Jel © (13.10.04 21:24)
Подсети отсутствуют? По идее должна была найти (если адреса компьютеров попадают в веденный диапазон) ...
> [8] jack128 © (13.10.04 21:23)
За что код поганишь, вертай как было...
Зависнуть не должно, видимол ты просто не дождался результатов отработки всех потоков
← →
Rouse_ © (2004-10-13 21:33) [12]Вот кстати, мне тут подсказали...
Если кто в домене, нельзя ли проверить следующую ситуацию...
Не осуществлять вход в домен а осуществить вход на локальный компьютер и запустить эту программу, я именно в таком варианте тестировал...
(Если, конечно, не сильно затруднит, потому что судя по отзывам в асе, в одноранговой сетке вообще проблем нет...)
← →
Jel © (2004-10-13 21:36) [13]
> Rouse_ © (13.10.04 21:29) [11]
Одна сеть с маской 240. Занят весь диапазон адресов. Нашел только меня. Файрвол на время запуска отключал.
← →
Rouse_ © (2004-10-13 21:37) [14]> Одна сеть с маской 240.
255.255.255.240?
Это конечно не мое дело, но зачем такая маска?
← →
Rouse_ © (2004-10-13 21:39) [15]> 13] Jel © (13.10.04 21:36)
Кстати, сенькс за подсказку, надо бы и маску учитывать...
← →
Verg © (2004-10-13 21:42) [16]
> 255.255.255.240?
> Это конечно не мое дело, но зачем такая маска?
А в чем проблема? Маска - как маска. Подсеть из 14 хостов. А что?
← →
Rouse_ © (2004-10-13 21:44) [17]> [16] Verg © (13.10.04 21:42)
Да ничего, конечно, странно просто видеть такую маску в одноранговой сети...
← →
jack128 © (2004-10-13 21:54) [18]Rouse_ © (13.10.04 21:29) [11]
За что код поганишь, вертай как было... Ну-ну. Тогда я точно нечего не дождусь. ;-) Потоку будут рубиться на ображении к абстрактному методу TThread.Execute. Еще я подправил if Addr =Integer(
INADDR_NONE) then Exit; без преобразования дельфя говорит, что условие всегда даст False. А программа таки виснет(пара минут - я считаю это виснет, особенно учитывая, что используются потоки). Почему - не знаю, но факт на экране..
← →
Jel © (2004-10-13 21:57) [19]
> Rouse_ © (13.10.04 21:37) [14]
Этот диапазон выделен "свыше" :) А за циской растет довольно крупная WAN.
← →
Verg © (2004-10-13 21:58) [20]Погоди, но у тебя п.б. начнет двигатся с места только когда потоки начнут завершаться? т.е. если они по каким-либо причинам надолго "повисают" в сканировании, то все это время п.б. будет молчать. Так?
← →
Rouse_ © (2004-10-13 22:00) [21]> [18] jack128 © (13.10.04 21:54)
Ок, у тебя какая версия Дельфи?
Просто знакомо
> без преобразования дельфя говорит, что условие всегда даст False
← →
Verg © (2004-10-13 22:01) [22]
> [17] Rouse_ © (13.10.04 21:44)
> > [16] Verg © (13.10.04 21:42)
> Да ничего, конечно, странно просто видеть такую маску в
> одноранговой сети...
Ничего странного не вижу. Даже наоборот. Ну вот столько выделено на маршрутизаторе в этот сегмент. Ничего особенного - ситуация обныкновеннейшая.
← →
Rouse_ © (2004-10-13 22:03) [23]> [20] Verg © (13.10.04 21:58)
Тут ключевое "когда потоки начнут завершаться"
Да именно так, проблема в том что у меня на проблемной машине первый поток начинает отрабатывать только после того как создан и запущен самый последний, а на запуск всех потоков уходит около 8 секунд при этом приложение конкретно виснет...
На домашеней машине все работает как и задумано...
← →
Rouse_ © (2004-10-13 22:04) [24]> Ничего особенного - ситуация обныкновеннейшая
Даже не спорю, просто не имел дел (и в практике ее не наблюдал) с одноранговой с несколькими сегментами...
← →
jack128 © (2004-10-13 22:05) [25]Rouse_ © (13.10.04 22:00) [21]
Д5. За 10 минут прога так и не отвисла...К черту её.
← →
Rouse_ © (2004-10-13 22:08) [26]> [25] jack128 © (13.10.04 22:05)
Стукни завтра в асю плз...
> [20] Verg © (13.10.04 21:58)
Поправлюсь, ПБ начинает двигаться с момента завершения любого из потоков...
← →
Verg © (2004-10-13 22:10) [27]
> [23] Rouse_ © (13.10.04 22:03)
> > [20] Verg © (13.10.04 21:58)
> Тут ключевое "когда потоки начнут завершаться"
> Да именно так, проблема в том что у меня на проблемной машине
> первый поток начинает отрабатывать только после того как
> создан и запущен самый последний, а на запуск всех потоков
> уходит около 8 секунд при этом приложение конкретно виснет...
> На домашеней машине все работает как и задумано...
А как задумано-то? Если каждый поток подолгу висит по причинам - ну, например,
1. нет у меня такой подсети вообще (192.168....)
2. выключен NBT (NetBIOS Over TCP/IP)
3. NetBEUI вообще отсутствует как класс
← →
panov © (2004-10-13 22:10) [28]>Rouse_ ©
Смотря как настроена маршрутизация.
В зависимости от настроек сети сканирование может идти и по 15 минут...
← →
Rouse_ © (2004-10-13 22:14) [29]> А как задумано-то?
Да задумка простейшая...
Берем диапазон IP и на каждый запускаем поток который должен:
1. Увеличить счетчик потоков через Synhronize
2. Из IP получить имя машины
3. Выполнить NetShareEnum на указанное имя
3. через Synhronize вывести результат
4. через Synhronize уменьшить счетчик потоков
прогресс начинает двигаться при уменьшении счетчика потоков...
← →
Rouse_ © (2004-10-13 22:16) [30]> [27] Verg © (13.10.04 22:10)
Да, по всем этим причинав сканирование вообще не выполнится, но выполняется ж зараза (только иногда медлено ;)
← →
Verg © (2004-10-13 22:31) [31]
> > [27] Verg © (13.10.04 22:10)
> Да, по всем этим причинав сканирование вообще не выполнится,
> но выполняется ж зараза (только иногда медлен
И вот еще: DNS сервер настроен и настроен правильно на DNS провайдера, находящегося, правда, за 5 хопов от моего компа.
function TScanThread.GetCompName(const Addr: Integer): String;
Будет тормрозить обязательно! - раз идет WsaSTARTUP/Clenaup(это на каждый вызов процедуры) и синхронные запросы к DNS про адрес, которые тот и знать ничего не знает.
По сути ты эти 8 секунд наблюдаешь - это сетевое ядро долбится к DNS-у, а тот либо "далеко", либо канал до него узкий, либо он не работает.
Так я не понял - в чем проблема, тогда. В том, что медленно или, что вообще не выполняется?
← →
Rouse_ © (2004-10-13 22:32) [32]> В зависимости от настроек сети сканирование может идти и
> по 15 минут...
Ужас, Сань вы это там что, над Юзерами прикалываетесь чтоль, чисто по админски (с такими настройками)? ;))
← →
Rouse_ © (2004-10-13 22:35) [33]> Будет тормрозить обязательно
Согласен, но это обычные тормоза и они абсолютно нормально укладываются в примерно 15-100 мсек (в течение работы всей программы в сумме)...
А проблема именно в том, что вот этот код:
for I := AFrom to ATo do
with TScanThread.Create(False) do
begin
IP := inet_addr(PChar(Prefix + IntToStr(I)));
FreeOnTerminate := True;
Resume;
end;
на моей машине рабочей (не домашней) обрабатывает 8 секунд...
в то время как на домашней не более 15 мсек...
Вот и пытаюсь найти проблему...
← →
Torry © (2004-10-13 22:36) [34]To Rouse_
Надо реально помочь? Подсказками мало можно, давай тебе наш PSSDK подгоню... Надо: Имя, фамилию, компанию, e-mail на кого регистрировать.
← →
Rouse_ © (2004-10-13 22:37) [35]Заметь - это код выполняющийся в основном потоке. Т.е. он тормозить вообще не должен, запустил потоки и ждет...
← →
Rouse_ © (2004-10-13 22:38) [36]> [34] Torry © (13.10.04 22:36)
Спасибо Максим, завтра свяжусь :)
← →
Verg © (2004-10-13 22:43) [37]
> Согласен, но это обычные тормоза и они абсолютно нормально
> укладываются в примерно 15-100 мсек
Ты не понял - если про этот адрес DNS ничего не знает, то разрешение его имени ядро будет добиваться у DNS-а секунды.
Попробуй tracert на заранее "безымянный" комп по его Ip-шнику: секунды 4 пытается добиться его имени...
> for I := AFrom to ATo do
> with TScanThread.Create(False) do
> begin
> IP := inet_addr(PChar(Prefix + IntToStr(I)));
> FreeOnTerminate := True;
> Resume;
> end;
>
> на моей машине рабочей (не домашней) обрабатывает 8 секунд...
> в то время как на домашней не более 15 мсек...
Так что же, ты CreateSuspended = false создаешь, а потом полям этого j,]trnf-потока чт-то начинаешь присваивать (тот-то уже "помчался", уже в полете, так сказать), да еще и Resume ему - кнтрольный выстрел что ли? :))))
← →
Verg © (2004-10-13 22:58) [38]Всякие ProcessMessages надо тоже убрать, на мой взнляд - они тоже тормозят (держат synchronize у потоков) при том совершенно бесполезны.
← →
jack128 © (2004-10-14 01:52) [39]Если внемлишь советам Verg"a то все заработает. Проверено мной(с) :-)
← →
Vlad Oshin © (2004-10-14 09:08) [40]сеть с доменом (2 домена, блин.. )
нашла 31 машинку, ну утро еще, пока чаи гоняют, видать
Сканирует рывками. Сразу находит 30% (1-2 сек), потом еще 30-40%(2-3 сек), и окончательно еще ~2 сек
← →
Rouse_ © (2004-10-14 09:27) [41]Тэкс, вот про CreateSuspended = false это да, это я маху дал :))
Показываю текущую проблему:type
TTestThread = class(TThread)
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Start: Cardinal;
S: TStringList;
begin
S := TStringList.Create;
try
Start := GetTickCount;
for I := 1 to 255 do
with TTestThread.Create(True) do
begin
S.Add(IntToStr(I) + ":" + IntToStr(GetTickCount - Start));
FreeOnTerminate := True;
Resume;
end;
finally
Memo1.Text := S.Text;
S.Free;
end;
end;
{ TTestThread }
procedure TTestThread.Execute;
begin
// inherited;
end;
Здесь как видно создаются пустые 255 потоков и засекается время между их созданием...
На одной машине этот код пробегает за 15мсек
а на моей рабочей примерно вот такие данные:1:16
...
100:672
...
255:1532
Первое число - номер создаваемого потока, второе - время прошедшее с момента старта процедуры...
Вот именно чего я никак не могу понять, отчего такие тормоза :)
← →
panov © (2004-10-14 10:09) [42]>Rouse_ © (14.10.04 09:27) [41]
А какая ОС?
← →
Rouse_ © (2004-10-14 10:21) [43]XP SP2 со всеми обновлениями
D7 SP1
← →
panov © (2004-10-14 10:33) [44]>Rouse_ © (14.10.04 10:21) [43]
мда...
На w2000prof у меня тратится 78мс на весь этот цикл...
← →
Rouse_ © (2004-10-14 10:34) [45]Во-во, я о чем и говорю, чудеса блин термоядерной рекуперации :((
← →
panov © (2004-10-14 10:38) [46]>Rouse_ © (14.10.04 10:34) [45]
т.е. на одной ОС, но на разных ПК картина отличается?
← →
Rouse_ © (2004-10-14 10:41) [47]Да, дома стоит тоже самое только Дельфи не пропатченное...
Запустил на второй рабочей машине с ХР SP1, D7 SP1 - тоже скорость низкая, полный цикл за 600-700 Мсек пробегает...
Компьютеры Р4-3.200
← →
panov © (2004-10-14 11:01) [48]>Rouse_ © (14.10.04 10:41) [47]
А попробуй CreateThread в цикле вызвать, т.е. создать потоки без использования VCL.
← →
Rouse_ © (2004-10-14 11:07) [49]Гы, ты не поверишь, тоже самое, один в один... :((
← →
panov © (2004-10-14 11:28) [50]>Rouse_ © (14.10.04 11:07) [49]
А если в консольном приложении?
program Project1;
{$APPTYPE CONSOLE}
uses
classes,windows,SysUtils;
type
TTest=class(TThread)
protected
procedure Execute;override;
end;
procedure TTest.Execute;
begin
end;
var
i: Integer;
Start: Cardinal;
begin
Start := GetTickCount;
for i := 0 to 255 do
begin
with TTest.Create(True) do
begin
FreeOnTerminate := True;
Resume;
WriteLn(IntToStr(I) + ":" + IntToStr(GetTickCount - Start));
end;
end;
ReadLn;
end.
И еще проверь, от Delphi зависит или нет - вот в D6 откомпилировано:
ftp://ftp.spb.gkbank.ru/download/Test/Project1.exe
← →
Rouse_ © (2004-10-14 12:23) [51]Консоль аналогично, сейчас солью, проверю...
← →
Rouse_ © (2004-10-14 12:33) [52]> [50] panov © (14.10.04 11:28)
Твой ЕХЕ влет отработал :(
← →
panov © (2004-10-14 13:05) [53]>Rouse_ © (14.10.04 12:33) [52]
По рассказам мастеров в D7 реализация потоков отличается от D6, а в D6 от более низких версий(у меня D7 нет).
← →
Verg © (2004-10-15 00:25) [54]
> Rouse_ © (14.10.04 09:27)
Да, ну допустим, измерение времени в данном случае нельзя назвать чистым - там ко времени подмешиваютя.
> S.Add(IntToStr(I) + ":" + IntToStr(GetTickCount - Start));
Операции IntToStr, строковое объединие ( 2 раза ) и операция Add в TStringList. В среднем - 6 мс на итерацию цикла. Сказать, что много? - а фиг его знает
А если так, то что напишет?procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Start: Cardinal;
S: TStringList;
begin
S := TStringList.Create;
try
Start := GetTickCount;
for I := 1 to 255 do
with TTestThread.Create(True) do
begin
FreeOnTerminate := True;
Resume;
end;
S.Add(IntToStr(GetTickCount - Start));
finally
Memo1.Text := S.Text;
S.Free;
end;
end;
← →
Erik1 © (2004-10-15 10:51) [55]А почему бы ненаписать
TTestThread.Create(Prefix + IntToStr(I));
А в конструкторе
Create(Value: String);
IP := inet_addr(PChar(Value));
FreeOnTerminate := True;
inherited Create(False);
Попробуй может поможет, а еще лучше скомпилировать все под D5. А спотрел реализацию TThread под D6 мне очень непонравилось.
← →
Rouse_ © (2004-10-15 10:55) [56]> [54] Verg © (15.10.04 00:25)
Так пишет общее время в районе 1300Мсек
Да тут что-то по всей видимости с Дельфи, потомучто уж если деже через CreateThread тормозит, то я теряюсь...
Вот пример Панова который он у себя собрал - отработал как нужно. т.е. быстро, но этот же код собранный у меня - медленно...
В чем может быть проблема, даже ума не приложу...
> [55] Erik1 © (15.10.04 10:51)
Пробовал такой вариант, тоже самое...
← →
panov © (2004-10-15 12:36) [57]>Rouse_ © (15.10.04 10:55) [56]
Моарль - D6 лучше, чем D7, а D5 лучше, чем D6.
А всех лучше - D3. (это так - самохоливарчик)
← →
Rouse_ © (2004-10-15 12:58) [58]> [57] panov © (15.10.04 12:36)
А паскаль всему голова ;)
← →
Aldor © (2004-10-22 15:56) [59]Позволю себе поднять ветку:
как версия компилятора может влиять на скорость вызова CreateThread??!
← →
Anatoly Podgoretsky © (2004-10-22 16:16) [60]panov © (15.10.04 12:36) [57]
Никакого холивара, так и есть, единственно возможности разные.
← →
Rouse_ © (2004-10-22 16:57) [61]> [59] Aldor © (22.10.04 15:56)
Версия дельфи ни при чем.
На обоих компьютерах она стоит одинаковая (специально дома сделал систему один в один с рабочим компьютером, включая OS и SP).
И всеравно наблюдается такой глюк с подтормаживанием на рабочем компьютере...
← →
Aldor © (2004-10-22 20:17) [62]Так я не понял, Вы нашли причину того, что откомпилированная у Панова программа работает быстрее на Вашей машине ([52])?
← →
имя (2004-10-22 21:25) [63]Удалено модератором
← →
Rouse_ © (2004-10-22 21:26) [64]> [62] Aldor © (22.10.04 20:17)
Нет, к сожалению не нашли...
Вчера общался с Юрием Зотовым, он предположил кое что, но предположение к сожалению оказалось неверным...
Теперь я совсем потерялся, решение не найдено и никто не может объяснить причину...
Хорошо что хоть в практике не приходится создавать так много потоков в цикле...
← →
wisekaa © (2004-10-22 23:00) [65]
> Rouse_
А что по железу, машины тоже одинаковые?
Мне на ум больше пока ничего не пришло.
← →
jack128 © (2004-10-22 23:04) [66]А у тя случайно не 16 цветов на мониторе?? :-))) А то я сегодня узнал, что программы, написанные на D5 не запускаются, если в настройках экрана выставлено 16 цветов...
← →
Rouse_ © (2004-10-22 23:26) [67]> [65] wisekaa © (22.10.04 23:00)
По железу почти один в один, если не брать харды то на нормальной машине (на которой все норм) проц 3.0 в отлицие от 3.2 на глючной рабочей
Память по гектару оба
Мать один в один
Видюха 5.600 против 5.200 на глючной (но не думаешь же ты что потоки от видео тормозят(ведь на второй рабочей тоже проверяли, и тоже тупит) ;)
> [66] jack128 © (22.10.04 23:04)
Ну и конечно, не 16 цветов :)
← →
wisekaa © (2004-10-23 00:02) [68]
> jack128 © (22.10.04 23:04) [66]
Вроде это только при использовании BDE.
> Rouse_ © (22.10.04 23:26) [67]
Нет не в видухе, я думал тормозят процы с мамками (бывают не удачные сочетани по производительности).
Харды - даже не знаю, насколько я понимаю, почти вся работа виндов с памятью все равно проходит через своп файл, но что-бы так зависеть от этого врядли.
А сетевухи? У меня на работе была глючная сетевуха, её коротнуло как-то в грозу, так работала ничего, но иногда глючила.
← →
jack128 © (2004-10-23 00:23) [69]wisekaa © (23.10.04 0:02) [68]
Вроде это только при использовании BDE.
использую IBX. Да и сам инсталятор Дельфи при попытке запуститься тоже виснет.
зы А как BDE связана с видео режимом??
← →
Rouse_ © (2004-10-23 00:24) [70]Ну блин...
А как создание потока с сетевухой то связано? ;)
← →
esu (2004-10-23 01:28) [71]сетка 192.168.1/24
вижу только себя (в домене)
← →
Rouse_ © (2004-10-23 01:34) [72]> [71] esu (23.10.04 01:28)
Вход в домен произведен? ...
← →
esu (2004-10-23 01:40) [73]Rouse_ © (23.10.04 01:34) [72]
Да. Это win2kserver, контроллер домена. ДНС соответственно localhost. Но сканирует относительно быстро (жаль что неверно :)
← →
esu (2004-10-23 01:46) [74]2. выключен NBT (NetBIOS Over TCP/IP)
3. NetBEUI вообще отсутствует как класс
← →
Rouse_ © (2004-10-23 01:47) [75]> ДНС соответственно localhost
Собственно это демо опирается именно на сетевое имя, так что...
← →
wisekaa © (2004-10-23 02:32) [76]
> Rouse_ © (23.10.04 00:24) [70]
Не с сетевухой создание не связано, это я про время отклика.
> jack128 © (23.10.04 00:23) [69]
BDE Adminnistrator требует такую цвет. гамму, думаю для работы с картинками в блобах, так что не исключаю такое требование и от других драйверов БД.
← →
Aldor © (2004-10-23 09:37) [77]В D6 и в D7 с разной скоростью срабатывает именно строчка
call CreateThread
или что-то еще?
← →
Rouse_ © (2004-10-23 13:34) [78]> [77] Aldor © (23.10.04 09:37)
нет.
Есть 2 абсолютно идентичных компа.
На обоих стоит семерка с первым сервиспаком.
На одном нормально идет создание потока, на другом сильно тормозит...
Страницы: 1 2 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.66 MB
Время: 0.049 c