Название: Странность WaitForSingleObject Отправлено: Mityai от Март 29, 2010, 15:05 Доброго всем времени суток! Проблема такого рода. Есть 2 приложения, одно создает событие, другое к нему обращается:
Создатель: Код: #include <QtCore/QCoreApplication> Обращающийся: Код: #include <QtCore/QCoreApplication> Проблема том, что при замене в создателе while(1) на while(!b) или, скажем, на while (ddd != 0x00000102L) отлов события не происходит, хотя по вечному циклу while (1) он идет превосходно. Подскажите, пожалуйста, в чем здесь проблемка-то??? Заранее извиняюсь, если моя терминология насчет событий некорректна. Да, GetLastError() в обращающемся возвращает 2, как будто Event не создан, и если в if внутри while (1) добавить break, опять же отлов события не произойдет. Название: Re: Странность WaitForSingleObject Отправлено: alexman от Март 29, 2010, 21:03 Завязывай с WINAPI ;)
Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 30, 2010, 08:32 Завязывай с WINAPI ;) Дык самое обидное, что Win32 Console, собранная под стандартным MSVS 2005 с таким же кодом, прекрасно работает! >:( Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 30, 2010, 08:47 Каюсь, не думал, что проблема в этом. Отказывается работать в том случае, если вслед за циклом идет объявление еще одного хэндла:
HANDLE hMapped = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1048576, ((const WCHAR*)"map")); Создание проецируемого файла - вещь необходимая, ради нее сихронизация SingleObject и затевалась. Что делать? Название: Re: Странность WaitForSingleObject Отправлено: Akaiten от Март 30, 2010, 09:35 Я бы написал так:
Код
Проверь наличие ошибок при вызове CreateEvent, OpenEvent, SetEvent и т.п. Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 30, 2010, 09:43 Проверь наличие ошибок при вызове CreateEvent, OpenEvent, SetEvent и т.п. Код: LPCTSTR str = (LPCTSTR)"Event"; i = 0, создает корректно. А OpenEvent, Как я уже писал выше, выдает ошибку за номером 2, событие не существует. Меня всё же терзают сомнения, что есть какой-то косяк при работе с более чем одним HANDLE. Название: Re: Странность WaitForSingleObject Отправлено: Akaiten от Март 30, 2010, 12:11 Попробуй в OpenEvent указать права доступа EVENT_MODIFY_STATE вместо EVENT_ALL_ACCESS, и лучше использовать более специфичное имя вместо "Event".
Название: Re: Странность WaitForSingleObject Отправлено: Rcus от Март 30, 2010, 16:33 Хм... а компилятор не ругается на то что const char[] преобразуют к const WCHAR* (где sizeof(WCHAR) == 2).
Я вполне могу себе представить такую ситуацию при линковке когда за строкой "Event" не будет трех 0x00 подряд. Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 30, 2010, 16:43 Хм... а компилятор не ругается на то что const char[] преобразуют к const WCHAR* (где sizeof(WCHAR) == 2). Я вполне могу себе представить такую ситуацию при линковке когда за строкой "Event" не будет трех 0x00 подряд. Не ругается... Была уже с этим подобная проблема, когда CreateFileMapping делал - там преобразовывалось некорректно. Здесь в дебаге проверял - вроде как присваивает одинаково в обоих приложениях. Попробуй в OpenEvent указать права доступа EVENT_MODIFY_STATE вместо EVENT_ALL_ACCESS, и лучше использовать более специфичное имя вместо "Event". Это не пробовал, надо будет проверить. Хотя даже если и так, все равно не понятно почему при while(1) работает, а иначе нет. Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 31, 2010, 09:54 Хм... а компилятор не ругается на то что const char[] преобразуют к const WCHAR* (где sizeof(WCHAR) == 2). Я вполне могу себе представить такую ситуацию при линковке когда за строкой "Event" не будет трех 0x00 подряд. Спасибо, Rcus, за наводку. Проблема вознимает действительно в момент преобразования текста в CreateFileMapping. Заменил HANDLE создания маппинга на Код: LPCTSTR str2; ------------------------------------------------------------------------------------- Для MSVS2005 нашел корректно работающее преобразование: Код:
Название: Re: Странность WaitForSingleObject Отправлено: Rcus от Март 31, 2010, 10:08 Подсказки уже были даны... Либо используйте LPCSTR и *A варианты вызовов (что по идее deprecated), либо LPCTSTR, оборачивайте литералы в _T/_TEXT и используйте макро-имена для вызовов, либо LPCWSTR, и *W варианты вызовов (при этом нужно писать L перед строковыми литералами).
Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 31, 2010, 10:15 Подсказки уже были даны... Либо используйте LPCSTR и *A варианты вызовов (что по идее deprecated), либо LPCTSTR, оборачивайте литералы в _T/_TEXT и используйте макро-имена для вызовов, либо LPCWSTR, и *W варианты вызовов (при этом нужно писать L перед строковыми литералами). Изначально литералы использовал и какой-то подобный косяк словил. Там тоже проблем своих хватает. Хотя, может тоже где-то ошибся. Кода не осталось, поэтому проверить не могу. В любом случае спасибо большое за помощь!Название: Re: Странность WaitForSingleObject Отправлено: Mityai от Март 31, 2010, 14:00 Проблема решается объявлением LPCTSTR следующим образом:
Код: LPCTSTR str = L"Event"; |