| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > WaitForSingleObject в созданном потоке |
| Автор: freezeman 25.3.2012, 10:23 | ||
| Всем привет! Подскажите, пожалуйста, в чем может быть проблема... Создал в консоли событие и ожидаю ответ функцией WaitForSingleObject из другого приложения PulseEvent...все работает как задумано. Но когда перенес код в службу в отдельный поток, вылетает после WaitForSingleObject... Создавал поток в службе так:
И ещё, как удалить поток с помощью RemoteThread? |
| Автор: freezeman 25.3.2012, 12:12 |
| Подскажите, please! Что только не перепробовал...проблема скорее всего в потоке, как решить?? |
| Автор: freezeman 25.3.2012, 13:01 | ||||||
Я написал код создания потока, думаю там ошибка... Когда тот же код выполняю в основном потоке работает нормально, в созданном мною вылетает без ошибки Код:
Добавлено через 11 минут и 59 секунд Может какие-нибудь особенности есть?? Я только выяснил, что ни проекция созданная в памяти не открылась, ни событие CreateEvent... |
| Автор: volatile 25.3.2012, 14:12 | ||
Ну так с этого и надо начинать было. Посмотрите что GetLastError () говорит после CreateEvent(), почему не открылось? |
| Автор: Dem_max 25.3.2012, 14:17 | ||
Этот код просто пипец
|
| Автор: freezeman 25.3.2012, 14:20 | ||||
))))) Почему? У меня внедряется dll в процессы и перехватывает сообщения, перехватив в этом цикле получать сообщения о поступивших данных для статистики и обратно ожидать новых данных, после WaitForSingleObject полученные данные будут заноситься в массив для статистики... Есть более не пипецное решение?))) |
| Автор: Dem_max 25.3.2012, 14:30 |
| Если в этот код передастся управление то он будет работать вечно и этот поток ужи ничего не выполнит |
| Автор: freezeman 25.3.2012, 14:38 | ||
Я думаю, что после создания проецируемого файла и события, зайдя в цикл требуется только принимать данные, которые записываются в проец. файл и посылается событие PulseEvent из другой программы, тем самым получается бесконечные "приёмник"... Я ошибаюсь? |
| Автор: Dem_max 25.3.2012, 14:41 |
| Ошибаешься, поток войдет в бесконечный цикл и больше ничего не сделает никогда, даже поток никогда не закроется корректно. |
| Автор: freezeman 25.3.2012, 14:50 | ||
Ну это не главная проблема... я тестировал вроде бы работало с одним сообщением это точно, с очередью не проверил, думал все нормально... Подскажи, пожалуйста, почему когда я создаю проекцию и событие в основном потоке, то в других приложениях они благополучно открываются, а если выношу в отдельный поток, то нет... |
| Автор: Dem_max 25.3.2012, 14:58 |
| ответы тут http://forum.vingrad.ru/index.php?showtopic=349158&view=findpost&p=2473241 |
| Автор: freezeman 25.3.2012, 15:10 | ||||
Если я сделал все правильно, код ошибки 0x5 |
| Автор: volatile 25.3.2012, 15:39 |
Number: 5 Constant: ERROR_ACCESS_DENIED Проблема в первом аргументе функции там должны быть нормальные аттрибуты, а не NULL Верней даже не здесь, а в основной программе, которая и создает первый евент. |
| Автор: freezeman 25.3.2012, 15:43 | ||
Представляете, создал отдельный консольный проект создал там дочерний поток и все заработало, но мне нужно именно в моей службе реализовать... просто понятия не имею в чем проблема... Как вы говорите о параметре в CreateEvent, почему же в другом проекте все заработало?? |
| Автор: xvr 25.3.2012, 15:46 | ||
Ваш цикл почти полностью аналогичен for(;;) ; (Отличие в том, что он не жрет процессор на 100% и сбрасывает event). Но в том, что он блокирует выполнение потока и никакие event'ы его отсюда не выведут, он аналогичен полностью. Это ACCESS_DENIED. Проблема не в том, что у вас отдельный поток, а в том, что у вас сервис. Окружение сервиса отличается от окружения пользовательского приложения. Попробуйте запустить свой сервис под вашим account'ом (а не под local system) - если заработает, то ищите недостающие права Добавлено через 3 минуты и 21 секунду
В правах. NULL в первом параметре - это права по умолчанию, а это значит, что права есть только у администратора и создателя объекта (т.е. local system для сервиса). Простой смертный пользователь этот объект открыть не сможет |
| Автор: volatile 25.3.2012, 15:52 |
| freezeman, гуглите про SECURITY_ATTRIBUTES |
| Автор: freezeman 25.3.2012, 15:59 | ||||
Да что это такое с самого утра, с 10 утра я сидел и решал эту задачу!!!! Одного вашего сообщения хватило, все заработало!!! СПАСИБО БОЛЬШОЕ!!! |
| Автор: freezeman 25.3.2012, 16:33 | ||
Нашел описание, уже завтра разберусь... СПАСИБО БОЛЬШОЕ!!! |
| Автор: freezeman 25.3.2012, 20:19 | ||
Решил проблему с правами, добавив следующий SECURITY_ATTRIBUTES:
ЕЩЁ РАЗ ВСЕМ БОЛЬШОЕ СПАСИБО ЗА ПОМОЩЬ, C++ И WINAPI НАЧАЛ ТОЛЬКО ИЗУЧАТЬ (ЖИЗНЬ ЗАСТАВИЛА:), В .NET ПРИВЫК... |