![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пауза в потоках [D7, Win2k, WinXP]
vasechka © (2004-09-29 15:07:00)Тут вопрос паузы в программе прозвучал, а вот я сейчас столкнулся с проблемой.
Я хочу вам рассказать такое наблюдение и задать вопрос.
Приложение у меня работает в 100 потоках к примеру, каждый поток реализует сетевое подключение, чтото наподобие брута. Каждый поток работает следующим образом. При его создание создается сетевой компонент со своими параметрами. Далее я с каждого потока отправляю пакет на логин к примеру по фтп. И всё это крутится в цикле while not Terminated Приходит событие об успешном логине. И вот тут камень, я не должен отправлять ответ мгновенно, нужно подождать хотя бы 5 секунд. Прочитав вопрос "паузы в программе" я решил попробовать это в потоках. Sleep(msecs) оказался не пригодным изза того что он притормаживает также работу сетевого компонента в потоке, если вообще не приостаналивает, но при этом ресурсов почти не съедал. Метод из RxLib грузит проц на 80% при 100 потоках, но сетевой комопнет работает чудесно. Отсюда вопрос как же всё таки заставить поток подождать определенное количество времени без особой загрузки проца. Может ктото уже сталкивался с этим.
Я слышал чтото про WaitMessage, но это мне кажется не то совсем, покажите пожалуйста если знаете, желательно в виде исходного кода. Мы пока учимся программить.
Sha (2004-09-29 18:27:00) [1]> vasechka (29.09.04 15:07)
ICS - это message-ориентированная библиотека.
Там никакие треды не нужны.
Сканер на твоих 500 на TWSocket-ах легко пишется
и прекрасно работает в основном потоке приложения.
debuger (2004-09-29 17:59:00) [2]Ни разу не стоит.
Для хорошого сетевого сканера, вполне подходящий метод.
Digitman (2004-09-29 15:48:00) [3]
> ставлю 500 потоков и хоть бы хны
алгоритм, требующий столько трэдов, можнго смело отправлять в мусор
Erik1 (2004-09-29 15:46:00) [4]Ты даже примерно непредставляеш себе как работает "Wsocket из набора ICS". Если будеш использовать Indy сможеш sleep использовать, навено еще больше ресурсов сэкономиш.
Digitman (2004-09-29 15:46:00) [5]
> Приходит событие об успешном логине. И вот тут камень, я
> не должен отправлять ответ мгновенно, нужно подождать хотя
> бы 5 секунд
что это еще за "событие" такое ? компонент какой используешь ?
где, каким документом регламентирован тот факт, что ты чего-то должен еще "ждать" ?
что значит "ответ" ? "ответ" предполагает "запрос" ! тебе кто-то запрос прислал ? что это за протокол, который посылает тебе запрос, на который ты якобы должен послать ответ ? в FTP нет такого !
vasechka (2004-09-29 15:29:00) [6]УХХХ ты, вот это работа, вот это я понимаю.
ставлю 500 потоков и хоть бы хны. максимум съедается 15% ресурсов проца.!!!
Ребята спасибо!
vasechka (2004-09-29 15:23:00) [7]Вот что нашел, сейчас попробую.
procedure Delay(Milliseconds: Integer);
var
Tick: DWord;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
Tick := GetTickCount + DWord(Milliseconds);
while (Milliseconds > 0) and
( MsgWaitForMultipleObjects (1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
Milliseconds := Tick - GetTickcount;
end;
finally
CloseHandle(Event);
end;
end;
vasechka (2004-09-29 15:20:00) [8]компонент
Wsocket из набора ICS
если работаю через sleep то не вызываются события пока этот sleep не закончится, то есть поток замирает наподобие метода suspended. а вот rxlib почемуто без особых проблем работает только вот ресурсов кушает оч много, так как каждый поток ведь вызывает его и каждый экземпляр потока начинает грузить проц таким циклом. Сейчас читаю про
MsgWaitForMultipleObjects только не врублюсь чтото. Помогите чтонить придумать ;)
MS Marketing Department (2004-09-29 15:14:00) [9]Что за сетевой компонент?
И почему все-таки ен Sleep?