| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Проблема с синхронизацией |
| Автор: NiJazz 2.11.2004, 17:54 |
| У меня такая ситуация. Есть два приложения: сервер и клиент. Общаются по Named Pipe. Когда клиент готов к отправке данных, он вызывает SetEvent и сервер переходит к вызову CreateNamedPipe. Сервер работает постоянно. Основная загвоздка заключается в том, что нужно, чтобы пока от клиента нет событий, то есть пока сервер ждёт, он выполнял какое-то действие, например, постоянно что-то писал в файл. Как только событие возникает, сервер прекращает работать с файлом и переходит к "общению" с клиентом. Я так понял, что когда клиент умолкает, сервер запускает функцию, в которой в бесконечном цикле идёт работа с файлом. Но как остановить эту функцию? Здесь помогут функции CreateThread и TerminateThread? Спасибо. |
| Автор: Step 2.11.2004, 18:05 |
| поставьте в цикл WaitForSingleObject с пердварительной инвертацией т.е. что бы она переходила в режим ожидания когда событие есть а не наоборот |
| Автор: NiJazz 2.11.2004, 19:48 | ||
Step
Это как сделать? То есть чтобы программа не висела при вызове WaitForSingleObject? |
| Автор: Mad 3.11.2004, 11:32 |
| NiJazz Можно вызывать WaitForSingleObject с таймаутом 0, тогда он будет просто проверять установлен ли эвент. Но правильней будет через потоки. |
| Автор: bel_nikita 4.11.2004, 00:49 | ||||||||
Может стоит два треда организовать. Вот, абстракция такая залетела в голову: класс потока
абстрактный класс двух активных потоков:
типа, наглядный пример использования:
Вот, такой, простенький, пример мне залетел в голову. Можно конечно и лучше придумать. А нужно ли мудрить? |
| Автор: maxim1000 4.11.2004, 01:35 | ||
может, попробовать такое?
так даже Event не надо |
| Автор: NiJazz 4.11.2004, 08:08 |
| maxim1000 На первый взгляд, вполне просто наглядно, но не хотелось бы иметь канал открытым, пока нет "событий" от клиента. |
| Автор: bel_nikita 4.11.2004, 10:43 | ||||||
maxim1000
Так, оно процессор загрузит на 100%. У меня при работе с COM портом, подобный пример грузит проц на 97%. Но как торлько перешел на тред с ожиданием события, точнее с автоматическим срабатывание, загрузка проца уменьшилась до 0% NiJazz
|
| Автор: maxim1000 4.11.2004, 12:23 | ||||
оно грузит процессор настолько, насколько его грузят две альтернативные части программы другое дело, что если притормозит одна из них, то притормозит и вторая - это минус...
а что здесь такого? Добавлено @ 12:24 еще можно попробовать асинхронный режим функции ReadFile Добавлено @ 12:25 (это, когда даешь команду "начать чтение", а потом тебе сообщают (возможно, с помощью Event), когда оно закончилось |