![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
neutrino |
|
||||||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Приветствую!
Есть два проекта: один на C# (гуй, WPF) и второй на C++. Оба проекта - отдельные процессы (екзешники). Процессы обмениваются данными через SharedMemory (т.е. MemoryMappedFile, т.к. в винде нет SM). Доступ к обшей структуре данных (очереди) синхронизируется с помощью двух семафоров. В общем ситуация довольно тривиальна: продьюсер-консюмер. Для проверки межпроцессовой коммуникации я написал простой С++ код, который генерит случайные массивы и пишет их в структуру в SharedMemory. Для простоты длина очереди (каждый элемент в которой эта структура) задана 1 (одному), т.е. счетчик на семафоре тоже идет от 0 до 1 (бинарный семафор). В последствии это будет изменено на какой-то n. Структура:
Она же в C#:
Код заполнения структуры:
Код считывания:
Код на самом деле распределен по методам, я его собрал так, чтобы удобно было читать. При запуске вываливается эксепшен SemaphoreFullException в помеченной строке. Т.е. второй процесс не уменьшил счетчик семафора при WaitForSingleObject(). SharedMemory - класс написанный мной и являет собой обертку для MemoryMappedFile API винды, он работает. В частности он передает названия семафоров для синхронизации. Родной дотнетовский System.IO.MemoryMappedFiles.MemoryMappedFile редкостное Г. не позволяет делать то, для чего этот MMF и был придуман. Хэндлы семафоров в С++ коде получаются и никаких ошибок не возникает. Странно еще то, что С++ код бежит не взирая ни на что. Т.е. он выполняет свои 100 итераций и дохнет. А где синхронизация? Что я упустил? Может я неправильно использую семафоры? Может дотнетовские семафоры невидны для unmanaged кода? Спасибо! -------------------- The truth comes from within ... Покойся с миром, Vit |
||||||||
|
|||||||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Спасибо, ребята!
Люблю этот форум! ![]() Значит как я и написал, семафор созданный в managed коде был недоступен в unmanaged, т.к. не было задано атрибута SYNCHRONIZE на ряду с SEMAPHORE_MODIFY_STATE. Любая попытка сделать WaitForSingleObject() давала WAIT_FAILED, а GetLastError() возвращал ACCESS_DENIED. Вот и все. делов то! Добавляем атрибут SYNCHRONIZE:
И все работает! -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |