Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Прерывание цикла по внешнему сигналу


Автор: Nuzur 6.7.2006, 11:36

Есть цикл он выполяняеться до тех пор пока булевская переменная не приймет значение true.
Суть вопроса - в цыкле стоит ожидание accept от сокета, но в какой-то момент времени пользователь может захоткть грохнуть сервер, а он стоит в режиме ожидания соеденения в цыкле, как быть-то? 

Автор: Daevaorn 6.7.2006, 11:43
Nuzur, каждую итерацию(или не каждую, это уже мелочи ) цикла опрашивай ввод пользователя, если конечно сервер нельзя грохнуть просто нажав "Х". 

Автор: adonin 6.7.2006, 12:44
Если я правильно понял вопрос, делайте ассинхронные сокеты:
см. API:
WSAAsyncSelect()
ioctlsocket()
Или делайте многопоточное приложение: в одном потоке выполняйте обработку пользовательских событий, а в другом - работайте с сокетами. 

Автор: Nuzur 6.7.2006, 17:03
Daevaorn, Каждую итерацию я и буду проверять но проблема то в том что пока сервер ждет клиента он будет его  ждать а не проверять что-то там. А если клиент не будет подключаться несколько дней что ему весеть-то? А такое вполне возможно.

adonin, Сервер клиент уже сделаны и ОЧЕНЬ не хочеться там что-то менять, может есть другой способ-то?
А про многопоточное да оно уже и так многопотоное. Делая его еще многопоточнее... ну прийдеться конечно наверно... smile Сам об етом думал просто и так на каждого потомка выделяеться поток да еще и в потоке их ждать...

Ладно, может оффтоп уже но тема то незакончена, как потом грамотно поток обрубить когда пойму что время пришло? 

Автор: Fazil6 7.7.2006, 01:02
Цитата

как потом грамотно поток обрубить когда пойму что время пришло?

грамотно - это когдапоток сам завершится, так что по твоему алгоритму - проверять из потока флаг остановки. Все способы грохнутьпоток извне считаются некорректными. А если у тебя клиент бесконечно ждет подключения,то это поумолчанию неправильно. Надо делать отдельные попытки подключиться, которые должны ограничиваться по времени. Между этими попытками и проверяй флаг остановки.
 

Автор: Earnest 7.7.2006, 06:36
Только лучше не флаг, а событие... И не проверять, а ждать (WaitForMultipleObjects): пришел один хандл - что-то делаем, пришел другой - завершаемся. 

Автор: Fazil6 7.7.2006, 20:36
Цитата

Только лучше не флаг, а событие... И не проверять, а ждать (WaitForMultipleObjects): пришел один хандл - что-то делаем, пришел другой - завершаемся. 
ага, только вопрос прочитай внимательно. 

Автор: bsa 7.7.2006, 21:33
Nuzur
Используя http://unixhelp.ed.ac.uk/CGI/man-cgi?fcntl+2 (fcntl.h) устанавливаешь на дескриптор соединения флаг O_NONBLOCK. После этого accept завершается сразу после вызова либо с установкой соединения, либо с кодом errno=EAGAIN (повторите позже)... Можно использовать http://unixhelp.ed.ac.uk/CGI/man-cgi?select+2 (unistd.h) для ожидания с таймаутом.
На сколько я знаю, в Windows что-то очень похожее. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)