Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки(3 быстрее чем 10ть), BeginThread 
:(
    Опции темы
pavelv
Дата 8.8.2006, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Для интереса решил написать свой скан портов так называемый. Написал и сначала 
поразился очень низкой скорости сканирования, по сравнению с аналогами из сетки. 
Решил сделать в несколько потоков, тоесть одну процедуру вызываю в цикле несколько раз:
Код

  for i:=1 to col_connect do
   h1[i]:=beginthread(nil,128,@connecting,nil,0,th1[i]);

В коннектинг из ключевого происходит следующее:
Код

  hSession[k]:=InternetOpen('Microsoft Internet Explorer',INTERNET_OPEN_TYPE_PROXY,PChar(S),nil,0);
   hURL[k]:=InternetOpenURL(hSession[k],Pchar(URL), nil,0,0,0);

Хоть процедура и одна, но каждый новый поток сканирует следующая пачку портов из выбранного интервала(тут всё работает без сомнений). 
В общем при работе программы происходит следующее чудо: сканирование при 3ех потоках 100портов происходит быстрее чем при 10ти потоках(9ти,8ми..4ех). Сначала подумал дело в том, что процедура одна. Написал 3 однотипных и вызывал их, эффект повторился. Может кто сталкивался с таким эффектом, почему 3 потока работают быстрее 10ти? Для статистики скажу, 3 потока сканит около 40 секунд, а 10ть около 60ти.

P.S> Программа отображает загрузку ЦП при работе, если верить данным 10ть потоков ему не помеха. И ещё в проге по таймеру отображается какие порты сканируются на данный момент, больше чем 2 порта за раз не изменяется.
PM MAIL   Вверх
Romikgy
Дата 8.8.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Ошибка в 17 строке!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
pavelv
Дата 8.8.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Орфография или синтаксис чтоли? smile
PM MAIL   Вверх
drkot
Дата 8.8.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(pavelv @  8.8.2006,  10:01 Найти цитируемый пост)
при 3ех потоках 100портов происходит быстрее чем при 10ти потоках

вобщето это нонсенс. однозначно большее количество потоков будет работать (сканировать) быстрее хотябы потому, что все потоки одновременно ждут ответа с закрытого порта.
 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Romikgy
Дата 8.8.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(pavelv @  8.8.2006,  09:32 Найти цитируемый пост)
Орфография или синтаксис чтоли? 

и то и другое , может в потоках которые запускаешь , быть глюки , ты код не приводишь , о чем тогда говорить , что поправлять, так как ты описал проблем , по идее не должно быть , а они есть , значит что то не досмотрел, а что смотри сам, если нет исходников!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rouse_
Дата 8.8.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Фигасе, ты порты сканируешь через InternetOpen?


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
dumb
Дата 8.8.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



для начала, насколько я понял, ты через прокси "скан" делаешь - от него может многое зависеть. потом, InternetOpen таки лучше один раз вызывать, если настройки не меняются.
PM MAIL   Вверх
Snowy
Дата 8.8.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вот сканер: http://forum.vingrad.ru/index.php?showtopic=75377
Шуршит в 255 потоков - только шорох стоит.
PM MAIL   Вверх
pavelv
Дата 8.8.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Да ошибся чутку не то сказал, сканер проверяет по заданному ИП(прокси) выход в инет, сканирую у него указанные порты.

Код

procedure connecting;
var    i,k:integer;

begin
 sleep(col_connect);

 for k:=1 to col do
  if h_ready[k] and not h_ready_yes[k] then break;
 h_ready_yes[k]:=true;
 if k=1 then prior := strtoint(E2) else prior := next1+1;
  next1:= strtoint(E2)+((StrToInt(E3)-StrToInt(E2)) div col_connect)*k;
//конечно next1 считается несколько неверно, при этом теряется хвост портов, 
//давно заметил лень править

 for i:=prior to next1 do
 begin
  sleep(col_connect);
  PortScan[k] := inttostr(i);
  s:=E1+':'+inttostr(i);
  hSession[k]:=InternetOpen('Microsoft Internet Explorer',INTERNET_OPEN_TYPE_PROXY,PChar(S),nil,0);
  if hSession[k]=nil then
  begin
       inc(pr_Bar);
       continue;
   end;


   hURL[k]:=InternetOpenURL(hSession[k],Pchar(URL), nil,0,0,0);
   if hURL[k]=nil  then
     begin
       InternetCloseHandle(hSession[k]);
       inc(pr_Bar);
       continue;
     end;
      Result := Result + ' Порт найден:'+inttostr(i)+';';
      inc(pr_Bar);
      Application.ProcessMessages;
    end;
      Flag_END_THREAD[k]:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
    cod_error:boolean;

begin
 interval := 1;
 for i:=1 to col_connect do
 begin
  Flag_END_THREAD[i]:=false;
  h_ready[i]:=true;
  h_ready_yes[i]:=false;
  PortScan[i]:='';
 end;

 Timer1.Tag := 0;
 Memo1.Clear;
 Memo1.lines.Add('PORT_SCAN: Çíà÷åíèå íå íàéäåíî');
 RESULT := '';
 Flag_END_THREAD_ALL:= False;
 E1 := Edit2.Text;
 E2 := Edit3.Text;
 E3 := Edit4.Text;
  URL:=Edit1.Text;

//здесь всякие проверки на правильность ввода были

  col_connect:=strtoint(Edit5.Text);
  for i:=1 to col_connect do
  begin
   Flag_END_THREAD[i]:=false;//массив, что поток закончил работу
   h_ready[i]:=true;//массив, что поток должен будет запуститься
   h_ready_yes[i]:=false;//массив, что поток начал работу
  end;

  for i:=1 to col_connect do
   h1[i]:=beginthread(nil,128,@connecting,nil,0,th1[i]);


//загрузка ЦП
  h1[i+1] := beginthread(nil, 1024, @GetCPUUsage, nil, 0, th1[i+1]);

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var j,i, i1:integer;
begin
 Flag_END_THREAD[col_connect+1]:=true;
 for j:=1 to col_connect+1 do
  if not Flag_END_THREAD[j] then break;
 if j>=col_connect+1 then Flag_END_THREAD_ALL := true;

 timer1.tag := timer1.Tag + interval;
 label2.Caption:=inttostr(Timer1.tag);
Код


 if interval<>0 then
 if PortScan[1]<>'' then
 begin
  for  i:=1 to col_connect do
  begin
   Memo1.Lines.Delete(i-1);
   Memo1.lines.insert(i-1,'PORT_SCAN: '+PortScan[i]);
  end;

  if (timer1.tag mod 10)=0 then
  begin
   Memo1.Clear;
   for  i:=1 to col_connect do
     Memo1.lines.insert(0,'PORT_SCAN: '+PortScan[i]);
   Memo1.lines.ADD(RESULT);
   Memo1.Update;
  end;
//   Memo1.Update;
 end;

 if interval<>0 then
 if Flag_END_THREAD_ALL then
 begin
  interval := 0;
  sleep(1);
  Flag_END_THREAD_ALL := false;
  Memo1.Clear;
  if Result<>'' then
  begin
   Memo1.lines.add(Result);
   Memo1.lines.add('Ïðîâåðêà çàêîí÷åíà'+inttostr(progressbar1.Position)+' '+inttostr(progressbar1.Max));
  end
   else
   Memo1.lines.add('Íèôèãà ÿ íå íàøåë');
 end;
end;


Snowy спасибо за сканер, завтра проверю на то как шуршит smile. Сейчас интересно почему тут такие глюки. 

P.S> Sleep ставил как раз из-за глюков, думал может они пересекаются каким-то образом


PM MAIL   Вверх
imageman
Дата 11.8.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: 1
Всего: 1



Слышал я как-то, что в WinXP SP2 добавили подсчет открытых соединений в XX секунд (кажется в 10 секунд) {А может не скорость открытия, а сам факт открытия многих соединений?...}.

Не исключено, что на это граничение ты и напарываешься - виндуза принудительно тормозит твою прогу (точнее соединения ставит на паузу). Сделано это то ли против p2p программ, то ли из-за борьбы со спамерами и троянами (которые жадны до соединений).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.