А нельзя ли при надобности завершения сервера тупо TerminateThread всем запущенным потокам сделать ? Или все же ждать до INFINITE в вызове WaitForSingleObject пока соответствующий поток сам успешно не завершиться .....
Можно сделать всё, что угодно и как угодно... Если ты пишешь прогу для себя.
А если серьезно, то вызвав TerminateThread, ты столкнешься с проблемой неосвобожденной памяти, выделенной в потоке, недеинициализированных устройств и прочих и прочих... Кто, например, закроет сокет, открытый в потоке?. Так что, если ты хочешь, чтобы твоя прога работала стабильно, то тебе придется искать пути _корректного_ завершения потока.
Я обычно делаю следующее: как правило потоки, работающие длительное время, представляют собой бесконечный цикл. Для выхода из такого цикла я обычно использую либо тупой булевский флаг, значение которого изменяется в главном окне при выходе, или же использую объект event, создаваемый с помощью функции CreateEvent. Если у тебя один поток, то и первый способ сойдет. Если потоков два и больше, то лучше все делать через объекты синхронизации (например, event).
ЗЫ. Кстати, о сокетах. Существует способ, чтобы сокет сразу отдавал управление проге, даже если он не завершил выполнение текущей операции (например, операции чтения). Такой режим называется асинхронный. В этом случае тебе не надо будет ждать, пока управление вернется в поток.