Пауза в нишките

Тук прозвуча въпросът за пауза в програмата, но сега се натъкнах на проблем. Искам да ви кажа такова наблюдение и да задам въпрос. Моето приложение работи в 100 нишки, например всяка нишка реализира мрежова връзка, нещо като груба. Всяка нишка работи по следния начин. Когато се създаде, се създава мрежов компонент със свои собствени параметри. След това изпращам пакет от всеки поток към входа, например чрез FTP. И всичко това се върти в цикъл, който не е прекъснат.Идва събитие за успешно влизане. И ето камъка, не трябва да изпращам отговора мигновено, трябва да изчакам поне 5 секунди. След като прочетох въпроса „пауза в програмата“, реших да опитам това в теми. Sleep(msecs) се оказа неизползваем поради факта, че той също забавя работата на мрежовия компонент в нишката, ако не изобщо, но в същото време почти не изяжда ресурси. Методът от RxLib зарежда 80% процента при 100 нишки, но мрежовият comnet работи чудесно. Оттук и въпросът как все пак да принудите нишката да изчака определено време без много натоварване на процесора. Може би някой вече е попадал на това. Чух нещо за WaitMessage, но ми се струва, че не е съвсем правилно, моля, покажете ми, ако знаете, за предпочитане под формата на изходен код. Все още се учим да програмираме.

Какво е мрежов компонент?

И защо все пак en Sleep?

компонент Wsocket от набор ICS

ако работя през сън, тогава събитията не се извикват, докато този сън не приключи, т.е. нишката замръзва като суспендирания метод. но по някаква причина rxlib работи без никакви проблеми, само че яде много ресурси, тъй като всяка нишка го извиква и всеки екземпляр на нишката започва да зарежда проценти с такъв цикъл. Сега чета за MsgWaitForMultipleObjects, но не мога да го разбера. Помогнете на chnitидва с ;)

Ето какво намерих, сега ще го пробвам.

procedure Delay(Miliseconds: Integer); var Tick: DWord; Събитие: THandle; begin Event := CreateEvent(nil, False, False, nil); опитайте Tick := GetTickCount + DWord(милисекунди); while (Miliseconds > 0) и ( MsgWaitForMultipleObjects (1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) започват Application.ProcessMessages; Милисекунди := Тик - GetTickcount; край; накрая CloseHandle(Event); край; край;

УХХХ ти, това е работа, това разбирам. Сложих 500 струйки и поне къна. изяждат се максимум 15% от ресурсите на процесора. Благодарим ви момчета!

Дори не можете да си представите как работи "Wsocket от ICS". Ако използвате Indy, можете да използвате sleep, ще спестите още повече ресурси.

> Получено е успешно събитие за влизане. И ето го камъкът, аз > не трябва да изпраща незабавно отговор, но трябва да изчака > 5 секунди

що за "събитие" е това? какъв компонент използваш?

къде, какъв документ регламентира факта, че все още трябва да "чакате" нещо?

какво означава "отговор"? "отговор" означава "заявка"! някой изпрати ли ви заявка? какъв е този протокол, който ви изпраща заявка, на която уж трябва да изпратите отговор? във FTP няма такова нещо!

> Сложих 500 струйки и поне къна

алгоритъм, който изисква толкова много нишки, може спокойно да бъде изхвърлен в кошчето

Никога. За добър мрежов скенер това е добър метод.

> васечка (29.09.04 15:07)

ICS е ориентирана към съобщения библиотека. Там не са необходими нишки. Скенерът на вашия 500 на TWSockets е лесен за запис иработи добре в основната нишка на приложението.