Доступ к pRenderTarget в многопоточном режимеC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Доступ к pRenderTarget в многопоточном режиме

Сообщение Гость »

У меня есть функция для загрузки растрового изображения из файла, и она работает, но если я обращаюсь к ней в многопоточном режиме, это в большинстве случаев приводит к сбою моей программы. Я понял, что это такая строка кода:

Код: Выделить всё

hr = this->pRenderTarget->CreateBitmapFromWicBitmap(pConverter, NULL, ppBitmap);
Вот полный код:

Код: Выделить всё

CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&this->pWIC)
);
hr = this->pFactory->CreateHwndRenderTarget(
RenderTargetProperties(),
HwndRenderTargetProperties(hWnd, size),
&this->pRenderTarget
);
void LoadBitmapFromFile(PCWSTR uri, ID2D1Bitmap** ppBitmap)
{
while (this->loading) {
std::this_thread::sleep_for(std::chrono::microseconds(1));
}
this->loading = true;
IWICBitmapDecoder* pDecoder = NULL;
IWICBitmapFrameDecode* pSource = NULL;
IWICStream* pStream = NULL;
IWICFormatConverter* pConverter = NULL;
IWICBitmapScaler* pScaler = NULL;
*ppBitmap = 0;

HRESULT hr = this->pWIC->CreateDecoderFromFilename(
uri,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&pDecoder
);

if (FAILED(hr))
{
MessageBox(HWND_DESKTOP, _T("ERROR: Failed to Create the iWIC factory."),
_T("DirectWrite Error"), MB_OK | MB_ICONERROR);
}

if (SUCCEEDED(hr))
{
hr = pDecoder->GetFrame(0, &pSource);
}

if (SUCCEEDED(hr))
{
hr = this->pWIC->CreateFormatConverter(&pConverter);
}

if (SUCCEEDED(hr))
{
hr = pConverter->Initialize(
pSource,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
NULL,
0.f,
WICBitmapPaletteTypeMedianCut
);
}
if (SUCCEEDED(hr))
{
hr = this->pRenderTarget->CreateBitmapFromWicBitmap(pConverter, NULL, ppBitmap);
}

SafeRelease(&pDecoder);
SafeRelease(&pSource);
SafeRelease(&pStream);
SafeRelease(&pConverter);
SafeRelease(&pScaler);
this->loading = false;
return;
}
Как вы можете видеть в коде, я сделал что-то, чтобы функция не могла выполняться дважды одновременно, но это не решило проблему.

Подробнее здесь: https://stackoverflow.com/questions/781 ... tithreaded
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»