Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 06:06 20.06.24 
Клубове/ Компютри и Интернет / Delphi Всички теми Следваща тема Пълен преглед*
Информация за клуба
Тема Пак Indy10: TIdScheduler.TerminateAllYarns;зацикля
Автор NikB (любопитен)
Публикувано09.02.05 00:22  



Проблемът сигурно не е в TIdScheduler.TerminateAllYarns, но аз стигнах до там.
Ситуацията е следната:
За тест в едно приложение съм си сложил две форми, едната се прави на Indy клиент, а другата - на сървър.
Налага ми се клиентът да е непрекъснато свързан с сървъра и затова ползвам IdThreadComponent1 при клиента.
Докато си работят не забелязвам проблеми, но когато реша да изключа сървъра, в IdTCPServer1.Active := false; работата се сгъбва - зацикля безкрайно.
Проследих процеса до унищожаването на нишките на сървъра и установих, че зациклянето е в унищожаването на някакъв TIdScheduler (най-вероятно това е Scheduler по подразбиране). Самото зацикляне става в последния while true, от който би трябвалод да се излезе с Break, но явно TerminateYarn(TIdYarn(Items[ i ])); не терминира tUsYarna-а :(

Сигурен съм, че проблемът е, защото не спирам сървъра по правилния начин
Та, моля, ако някой може да ми помогне да си затворя tIdTcpServer-a :)



procedure TIdTCPServer.TerminateAllThreads;
var
i: Integer;
begin
// TODO: reimplement support for TerminateWaitTimeout

//BGO: find out why TerminateAllThreads is sometimes called multiple times
//Kudzu: Its because of notifications. It calls shutdown when the Scheduler is
// set to nil and then again on destroy.
if Contexts <> nil then begin
with Contexts.LockList do try
for i := 0 to Count - 1 do begin
// Dont call disconnect with true. Otheriwse it frees the IOHandler and the thread
// is still running which often causes AVs and other.
TIdContext(Items[ i ]).Connection.Disconnect(False);
end;
finally Contexts.UnLockList; end;
end;

// Scheduler may be nil during destroy which calls TerminateAllThreads
// This happens with explicit schedulers
if Scheduler <> nil then begin
Scheduler.TerminateAllYarns;
end;
end;
========================
procedure TIdScheduler.TerminateAllYarns;
var
i: Integer;
begin
while True do begin
// Must unlock each time to allow yarns that are temrinating to remove themselves from the list
with FActiveYarns.LockList do try
if Count = 0 then begin
Break;
end;
for i := 0 to Count - 1 do begin
TerminateYarn(TIdYarn(Items[ i ]));
end;
finally FActiveYarns.UnlockList; end;
//TODO: Put terminate timeout check back
Sleep(500); // Wait a bit before looping to prevent thrashing
end;
end;




Цялата тема
ТемаАвторПубликувано
* Пак Indy10: TIdScheduler.TerminateAllYarns;зацикля NikB   09.02.05 00:22
. * Re: Пак Indy10: TIdScheduler.TerminateAllYarns;зацикля Pechenia   10.02.05 20:40
. * Не можах да забележа ефекта от антифризето ... NikB   10.02.05 21:40
. * Re: Не можах да забележа ефекта от антифризето ... mole.   10.02.05 22:40
. * Разбира се, ще изчета с удоволствие всичко :) NikB   10.02.05 23:17
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.