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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2008, 07:36   #1
InseR
Пользователь
 
Регистрация: 01.06.2007
Сообщений: 59
По умолчанию Проблема с реализацией потока

Здравствуйте.Я решил написать небольшой сканер портов и столкнулся со следующей проблемой.Когда я ввожу в программе все данные и нажимаю кнопку сканировать,программа хоть и выполняет сканирование определенного диапозона,но на это время становится полностью не доступной ( зависает ).Решил попробовать убрать зависание с помощью потоков.Оформил сканирование в отдельный поток,выставил приоритет ну и т.д,а тормоза как были так и остались.
Вот код процедуры запуска сканирования и код модуля потока сканирования:

Код:
procedure TMainForm.ScanButtonClick(Sender: TObject);
begin

 ScanMemo.Lines.Clear; // Чистим ScanMemo

 // Проверяем на заполнение полей
 if ( ScanIpEdit.Text = '' ) or ( ScanStartPortEdit.Text = '' ) or ( ScanEndPortEdit.Text = '') then
 begin
 ShowMessage('Не все поля заполнены');
 Exit;
 end;

 Scan:=TScanThread.Create(true); // Создаем поток
 Scan.Resume; // Запускаем поток
 Scan.Priority:=tpLowest; // Устанавливаем приоритет

end;


Код:
procedure TScanThread.Execute;
begin

 Synchronize(Scan); // Синхронизируем с VCL

 if terminated then  // Если поток завершен, то выход
 exit;

end;

procedure TScanThread.Scan;
var
 i:integer; // Счетчик для цикла
begin

 MainForm.TcpClient.RemoteHost:=MainForm.ScanIpEdit.Text; // Устанавливаем хост

 // Цикл по портам
 for i:=StrToInt(MainForm.ScanStartPortEdit.Text) to StrToInt(MainForm.ScanEndPortEdit.Text) do
 begin

 MainForm.TcpClient.RemotePort:=IntToStr(i); // Устанавливаем порт
 MainForm.TcpClient.Open; // Пробуем открыть

 if MainForm.TcpClient.Connected then // Если открылся...
 begin
 MainForm.ScanMemo.Lines.Add('Порт '+IntToStr(i)+' -> открыт'); // Выводим сообщение о том,что порт открыт
 MainForm.TcpClient.Close; // Закрываем порт
 end
 else
 MainForm.TcpClient.Close; // Закрываем порт

 end;
 Exit; // Выходим из процедуры

end;

end.

За сканирование портов отвечает процедура Scan,которая объявлена в разделе Private модуля потока.

Помогите решить проблему с тормозами пожалуйста.

Последний раз редактировалось Stilet; 19.08.2008 в 08:35.
InseR вне форума Ответить с цитированием
Старый 19.08.2008, 08:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Урррр... Не люблю VCLный поток...
А почему бы тебе не попробовать создавать поток через Win API?
И кстати попробуй в цикле сканирования поставить sleep(100), мож на проц не так давить будет...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2008, 08:41   #3
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

InseR, а в чем смысл вашего потока ? у вас же его нет.
У вас весь поток выполняется в основном VCL- потоке.
Для начала лучше всего почитайте теорию реализации потоков и методов синхронизации
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 19.08.2008, 09:00   #4
InseR
Пользователь
 
Регистрация: 01.06.2007
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
InseR, а в чем смысл вашего потока ? у вас же его нет.
У вас весь поток выполняется в основном VCL- потоке.
Для начала лучше всего почитайте теорию реализации потоков и методов синхронизации
Извините,но я не очень понял ход ваших мыслей.Как это - " поток выполняется в основном VCL-потоке" и как от этого избавиться?
InseR вне форума Ответить с цитированием
Старый 19.08.2008, 09:18   #5
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

правильно спроектировать многопоточность.
Вот вы используете Synchronize(Scan); а что при этом происходит ?
у вас же вся реализация потока заключается в методе scan.
метод Synchronize как вы сами написали в комментарии синхронизирует поток с основным VCL потоком, ну а раз вы это написали в коментарии, то должны понимать что пишете.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 19.08.2008, 09:36   #6
InseR
Пользователь
 
Регистрация: 01.06.2007
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
правильно спроектировать многопоточность.
Вот вы используете Synchronize(Scan); а что при этом происходит ?
у вас же вся реализация потока заключается в методе scan.
метод Synchronize как вы сами написали в комментарии синхронизирует поток с основным VCL потоком, ну а раз вы это написали в коментарии, то должны понимать что пишете.
А как же мне тогда выделить сканирование в отдельный поток?
InseR вне форума Ответить с цитированием
Старый 19.08.2008, 09:43   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Все сканирование реализовать в .Execute; Ну функцию scan
BOBAH13 вне форума Ответить с цитированием
Старый 19.08.2008, 10:13   #8
InseR
Пользователь
 
Регистрация: 01.06.2007
Сообщений: 59
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Все сканирование реализовать в .Execute; Ну функцию scan
А как же в этом случаи применить функцию синхронизации?Какой параметр ей передовать?
InseR вне форума Ответить с цитированием
Старый 19.08.2008, 10:19   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Все сканирование реализовать в .Execute; Ну функцию scan
посмотрите на реализацию функции scan и поймете что это глупость
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 19.08.2008, 10:21   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Сообщение от InseR Посмотреть сообщение
А как же в этом случаи применить функцию синхронизации?Какой параметр ей передовать?
Вы из принципа не читаете что вам осветуют ? перед тем как браться за реализацию многопоточности необходимо получить минимум матчасти по основам этого направления программирования. А статей по потокам великое множество. В конкретном случае неправильно все, поэтому подсказывать что-то конкретное безсмысленно.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить существование потока? John_chek Общие вопросы Delphi 3 17.01.2008 15:16
Создание события потока Arteom Общие вопросы Delphi 9 11.01.2008 21:16
Распараллеливание потока eXa Общие вопросы Delphi 3 19.07.2007 20:11