![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| <Spawn> |
|
||||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Так как данные моей ДЛЛ-ки будут использоваться разными процессами, то пришлось сделать функции синхронизации:
Вроде все нормально, но появился странный глюк - при получении данных из блока памяти (FileMapping), второй элемент массива содержит бредовые значения(В нутри тела функции это значение равно установленному, при получении же его программой оно искажается).
Причем, если убрать эти функции при получении данных, то все нормально. Но без синхронизации ни как нельзя. Может есть другой способ ее сделать? Это сообщение отредактировал(а) <Spawn> - 20.10.2003, 21:05 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
||||
|
|||||
| Dmitry V.Abramov |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
Создали хендл для именованного мутеха. Зашли, заблокировав остальных. Вышли из процедуры.
Создали хендл для именованного мутеха. Этим хэндлом затерли предыдищий, еще не закрытый... Или что-то еще не оговорено? Это сообщение отредактировал(а) Dmitry V.Abramov - 21.10.2003, 01:01 --------------------
/DVA |
||||||
|
|||||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
При вызове CreateMutex с именем уже существующего, возвращается хендл существующего мьютекса. По крайней мере, в одной книженции использован подобный подход из чего я сделал такой вывод.
Это сообщение отредактировал(а) <Spawn> - 21.10.2003, 04:19 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
Я так понимаю, что твоя прога ждет данных от dll загруженных в других процессах? Требуется: как-то информировать прогу о том, что данные поступили и на время обработки данных запретить модификацию другим процессам?
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
cully Совершенно верно. В ДЛЛ-ке реализованы различные функции для манипуляции данными, предоставленними CreateFileMapping+MapViewOfFile. Так как блок данных довольно большой и считывается блоками размером с integer то нужно делать блокировку на время получения данных. Вот как щас, но при этом совершенно мне непонятный глюк во втором элементе массива:
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Dmitry V.Abramov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
В win32 такого не бывает. Если тебе дали handle - изволь отдать, когда станет не нужен. Система ведет счетчик и по последнему СloseHandle уничтожит его физически. По "книжке" же тогда получается, что возможно уничтожить handle чужого процесса. В принципе, пару хэндлов можно и позабыть - они высвободятся при завершении приложения. Но у тебя, насколько я понял, идут интенсивные обращения к LockData и свободные хэндлы вполне могут закончиться. Тогда не откроется очередной мутех - а на handle=0 ты не проверяешь. Вполне возможный сценарий... Вот и Win32.hlp говорит: Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed. --------------------
/DVA |
|||
|
||||
| Dmitry V.Abramov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
Текст, действительно, двояко толкуется. Правильней звучало бы: При вызове CreateMuytex система возвращает хэндл для одноименного мутеха если он уже существует, или создает новый... --------------------
/DVA |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Dmitry V.Abramov Все окей с мьютексами. Можно было бы обойтись и без CreateMutex, но в ДЛЛ-ке, используемая мною переменная hMutex, содержащая хендл мьютекса, равна 0 при обращении к UnLockData. Я кстати не раз встречал уже подобный случай в ДЛЛ. Может кто обьяснит мне из за чего происходит инициализация переменных заново? Но не в этом дело то, а втом что при их использовании появляются совсем неясные глюки со вторым элементом массива.
Это сообщение отредактировал(а) <Spawn> - 22.10.2003, 05:23 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Dmitry V.Abramov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
<Spawn> ... Не вижу ничего окейного. Не вижу также где и как объявлена hMutex. Без понятия как используется DLL... Пока все что вижу - это ошибку чреватую переполнением таблицы хэндлов. Если в остальном коде такая же окейность, то... ничего кроме удачи пожелать не смогу.
--------------------
/DVA |
|||
|
||||
| <Spawn> |
|
||||||||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Да какое переполнение млин, цитата 1 из книги "Системное программирование в Windows 2000" из главы "Синхронизация", автор Ал Вильямс: "Если поток пытается создать объект, который уже существует, вызов создания объекта сработает как вызов открытия объекта ".
Цитата 2 оттуда же: "Create Mutex - создает новый обьект или открывает уже существующий " Часть ДЛЛ:
При попытке использовать hMutex в UnLockData он равен 0, поэтому приходится его получать при помощи CreateMutex, которая вернет хендл уже существующего мьютекса с таким именем. Даже если бы это было переполнение таблицы хендлов, как такое моглобы произойти при первом обращении к LockData? Пример тестирования. Первый элемент массива равен 1, второй 10, третий 100. Результат первой попытки получения данных(кодом, который я привел выше, без использования inet_ntoa, т.е. вывод данных при помощи получения их функцией GetShareData):
Второй :
Третий:
Если же убрать вызовы LockData и UnLockData, то результат такой, какой был указан сначала. Это сообщение отредактировал(а) <Spawn> - 22.10.2003, 07:20 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
||||||||
|
|||||||||
| Dmitry V.Abramov |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
Мндасссс... "Открывает существующий...". А дальше, наверное, что-то типа "Можете плевать на открытые хэндлы - система сама их закроет при завершении процесса" ? Или нет? Если нет, то с чего ты взял, что это тот-же самый хэндл? Может все-таки "хэндл для существующего уже объекта"? Не приходилось открывать один файл двумя программами одновременно? Тоже были одинаковые хэндлы? Если бы ты читал эту книжку как положено - с начала, то не пропустил бы то место, где рассказывается о ресурсах Windows и о хэндлах в частности. Я же привык объяснять прописные истины лишь тем, кто слушает, а не размахивает наугад раскрытой книжкой... Запусти вот эту "упрощенную" версию твоей же программы:
Выход по Ctrl+C. Во время ее работы сходи в TaskManager и посмотри на строчку Handles:... Про нулевой hMutex - тоже стало понятно при наличии текста. Но, боюсь, пускаться в объяснения - как бы не пристукнули умной книжной... --------------------
/DVA |
||||
|
|||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Да блин не в этом суть то. Проблема все равно не решиться! Я кажется совсем про другое вопрос задавал!
Да хоть такой код сделать:
Все равно тот же бред со вторым элементом массива. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Короче вопрос закрыт я нашел решение
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
Как мне кажется немного не верно используется мьютексы. Надо бы так:
1. При страте потока\процесса создается\открывается мьютекс. 2. Когда потоку\приложению требуется захватить ресурс он производит это при помощи WaitForSingleObject. 3. Когда ресурс больше не нужен делается ReleaseMutex, т.е. отпускаем ресурс. 4. При завершении потока\процесса делается CloseHandle, хотя для процессов это вроде и не надо, т.к. это за нас делает ОС. Суммируя все вышесказанное:
попробуй сделать так, может поможет. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
ай, млин, не успел -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |