Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 28

 
    // 2.2.6. Метод меняет размер отведённой памяти для файлового отображения. Метод в случае успешного завершения возращает TRUE или FALSE в случае ошибки.
    bool Resize(const DWORD64 dw64BytesMapping) // Количество резервируемой памяти для файлового отбражения.
     {
      DWORD         dwErrorCode = 0; // Последняя ошибка.
      tstringstream ssExclusion;     // Строка с сообщением об ошибке.
      dw64Bytes = dw64BytesMapping;
      ::SetLastError(0); // Сбрасываем последнюю ошибку.
      // Контроллируем на наличие дескриптора файла и имени файлового отображения.
      if (hFile == NULL && sName == _T(""))
       {
        if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          ssExclusion << std::endl << _T("Ошибка в методе \"Utils::MappingSTL::Resize()\".")
                      << std::endl << _T("Отсутствуют дескриптор пользовательского")
                      << std::endl << _T("файла и имя файлового отображения.") << std::endl;
          if (DEBUGGING) tcout << ssExclusion.str();
          if (DEBUGGING_EXCLUSION) throw(ssExclusion.str());
         }
        return(false);
       }
      // Создаем или открываем уже существующее отображение файла по дескриптору пользовательского файла.
      vhMapping.push_back(::CreateFileMapping(hFile, NULL, PAGE_READWRITE, Utils::FILESIZE64(dw64Bytes).dwSizeHigh, Utils::FILESIZE64(dw64Bytes).dwSizeLow, sName.c_str()));
      // Если получен не верный указатель на файловое отображение.
      if (vhMapping.back() == NULL)
       {
        if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          dwErrorCode = ::GetLastError(); // Получаем последнюю ошибку.
          ssExclusion << std::endl << _T("Ошибка в методе \"Utils::MappingSTL::Resize()\".")
                      << std::endl << _T("Размер памяти файлового отображения \"") << sName << _T("\" не изменён.")
                      << std::endl << LAST_ERROR_PARAMETER(dwErrorCode) << std::endl;
          if (DEBUGGING) tcout << ssExclusion.str();
          if (DEBUGGING_EXCLUSION) throw(ssExclusion.str());
         }
        return(false);
       }
      return(true);
     }
Это метод из класса для маппинга.
 
Zhunko:
Это метод из класса для маппинга.

И чо?

Тема ресайза маппинга не раскрыта.

 
Я так делаю.
 
Zhunko:
Я так делаю.

Т.е. при открытии маппинга с тем же именем и другим размером он меняет размер?

Можно не отвечать, в коде все равно не это. То что вы там так делаете с вопросом мало связано :) засим удачи.

 

Конечно, меняет. У меня библиотека на этом классе работает. Тесты в порядке. В копилке лежит самый первый вариант этой библиотеки.

Последний вариант библиотеки сам меняет размер в зависимоти от потребности.

 
TheXpert:

Т.е. при открытии маппинга с тем же именем и другим размером он меняет размер?

Можно не отвечать, в коде все равно не это. То что вы там так делаете с вопросом мало связано :) засим удачи.

Андрей, я перепроверил два варианта.

таки да. при вызове CreateFileMapping с тем же именем но с большим размером - память расширяется.
главное, чтоб первый хендл от CreateFileMapping не был закрыт (чтоб просто не потерять предыдущее содержимое).


Но! Во втором случае проверил гипотезу интереснее.

создается CreateFileMapping с начальным объемом (например 2 байта) а записывается в него 4 байта. И он сам по себе автоматически расширяется!

Так что необходимости в создании второго хендла CreateFileMapping с большим объемом нет.

думаю что вопрос закрыт.
 
sergeev:

Но! Во втором случае проверил гипотезу интереснее.

создается CreateFileMapping с начальным объемом (например 2 байта) а записывается в него 4 байта. И он сам по себе автоматически расширяется!

Так что необходимости в создании второго хендла CreateFileMapping с большим объемом нет.

думаю что вопрос закрыт.
Это в описании есть. Это удобно, но размер только увеличивается. Отнимает ресурсы. Надо свой диспетчер памяти делать.
 
Zhunko:
Это в описании есть.

в описании чего? мне ведь и надо, чтоб память увличилась.
 
sergeev:

в описании чего? мне ведь и надо, чтоб память увличилась.

MSDN :-))

Это я к тому, что, если память потребляемая увеличивается, то надо предусмотреть её освобождение.

 
при закрытии хендла память (которая была выделена сверх указанного в CreateFileMapping) разве не возвращается взад?