Hi, crowd;
Тута такая проблемка появилась....
Создал сокет...поставил на прослушку, в отдельном потоке — типа
....
while(!exit){
Socket sock = Socket.accept();
....
//тута создаем новый поток в котором идет обработка подключения(обмен инфой....)
}
......
все замечательно...вот ток когда я закрываю свое app тот поток в котором идет обработка подключения все еще жив....
то есть например когда в качестве клиента телнет мне нужно послать еще один байт чтоб все завершилось — телнет написал что connection lost...
Такое впечетление что поток — демон....а почему?...может кто т чтот подобное делал...поделится исходниками иль фрагментами....
Может я не правильно завершаю свое app?
В общем наверное вопрос в том как завершить app чтоб все потоки порожденные им умерли вместе с ним?
Re: Некоторая проблема с многопоточностью и сокетами
A>В общем наверное вопрос в том как завершить app чтоб все потоки порожденные им умерли вместе с ним?
Добавляй куда-нибудь в список (в ArrayList например) все запускаемые потоки, а при выходе из программы прибивай их вручную (через Thread.Abort например).
Все зависит от того, как устроен поток обработки подключения. Поставь там ожидание события выхода с таймаутом 0. Когда завершаешь свое приложение — взводишь событие и поток завершится. Само событие надо создать в основном потоке, а указатель на него передать при создании потока через параметр.
Re[2]: Некоторая проблема с многопоточностью и сокетами
Здравствуйте, Lion99rus, Вы писали:
L>Все зависит от того, как устроен поток обработки подключения.
ну просто пытаемся чет читать пока можем...!=-1
Поставь там ожидание события выхода с таймаутом 0. Когда завершаешь свое приложение — взводишь событие и поток завершится. Само событие надо создать в основном потоке, а указатель на него передать при создании потока через параметр.
А екзампл не затруднит...и попроще плиз..я ток прехожу на сей язык с Java
Re[2]: Некоторая проблема с многопоточностью и сокетами
Здравствуйте, Max Morozov, Вы писали:
MM>Здравствуйте, Alekseymir, Вы писали:
A>>В общем наверное вопрос в том как завершить app чтоб все потоки порожденные им умерли вместе с ним?
MM>Установить Thread.IsBackground=true в этом потоке, но лучше предусмотреть логику выгрузки
А что значит логика выгрузки?
Re[2]: Некоторая проблема с многопоточностью и сокетами
Здравствуйте, vguzev, Вы писали:
A>>В общем наверное вопрос в том как завершить app чтоб все потоки порожденные им умерли вместе с ним?
V>Добавляй куда-нибудь в список (в ArrayList например) все запускаемые потоки, а при выходе из программы прибивай их вручную (через Thread.Abort например).
ЭЭЭ, а это правильно...бить потоки так .. а не давать им завершится? вроде нет(покрайней мере на эту тему много разговоров было...правда в контексте Java)
V>Вадим Б. Гузев
Re[3]: Некоторая проблема с многопоточностью и сокетами
>ЭЭЭ, а это правильно...бить потоки так .. а не давать им завершится? вроде нет(покрайней мере на эту тему много разговоров было...правда в контексте Java)
Это нормально, если в этих потоках отлавливается ThreadAbortException и правильно закрываются все соединения в catch'е. А это можно спокойно сделать если есть исходники
Здравствуйте, Alekseymir, Вы писали:
A>А что значит логика выгрузки?
Например, создать AutoResetEvent, передавать его в поток. Если необходимо завершить программу, то сигналить этот Event. А в потоке ждать на этом Event'е и выгружаться, когда event придет в сигнальное состояние