опубликован 04-06-2001 07:06 MSK
Привет, о всезнающий All!Я тут опять что-то не догоняю слегка...
Краткий смысл такой:
Надо получать данные, отрисовать их,
и сохранить в файл..., но желательно,
чтобы этот процесс был возможен при минимизированных окнах, т.к. он не короток,
поэтому пытаюсь использовать Bitmap в памяти.
Заморочка, кажется, в том, что работаю
с ним из разных потоков...
1-ый поток:
в цикле по получению данных вызывается:
CDynamicChartData::FileError
CDynamicChartData::updateViewAndSaveToBmp(const char *szFileName)
{
FileError feResult;
CRect xWindowRect;
CWnd *pxWnd = CWnd::FromHandle(m_hChartView);
pxWnd->GetClientRect(xWindowRect);
CDC *pxDC = pxWnd->GetDC();
ASSERT(pxDC);
if (m_bSaveToFile)
{
m_xBitmap.CreateCompatibleBitmap(pxDC,xWindowRect.Width(),xWindowRect.Height());
m_hBitmap = (HBITMAP)m_xBitmap;
pxWnd->Invalidate();
pxWnd->UpdateWindow();
pxDC->SelectObject(&m_xBitmap);
CBmp16File xBmp16File(0,0);
xBmp16File.setColor(0, crBgrBrush);
xBmp16File.setColor(1, crChartColor);
xBmp16File.setColor(2, crBlack);
if (xBmp16File.saveTo(szFileName, pxDC, xWindowRect))
feResult = FE_OK;
else
feResult = FE_SAVEFAIL;
m_xBitmap.DeleteObject();
}
else
{
pxWnd->Invalidate();
pxWnd->UpdateWindow();
feResult = FE_OK;
}
return feResult;
}
2-ый поток:
Invalidate + Update из первого вызывает OnDraw во втором,
фрагменты OnDraw:
if (pDoc->m_xChartData.m_bSaveToFile)
{
///////////
pxMemDC = new CDC;
pxMemDC->CreateCompatibleDC(pDC);
//-----------------------------------
//ни так
pxMemBmp = CBitmap::FromHandle(pDoc->m_xChartData.m_hBitmap);
//ни так не прокатывает!!!
pxMemBmp = new CBitmap;
pxMemBmp->Attach(pDoc->m_xChartData.m_hBitmap);
//так нельзя, ибо когда разные потоки, то нужно работать с потоками
//pxMemBmp = &(pDoc->m_xChartData.m_xBitmap);
//-----------------------------------
pxOldBmp = pxMemDC->SelectObject(pxMemBmp);
pxSaveDC = pDC;
pDC = pxMemDC;
}
...
Не подскажите в чем конкретно проявилась моя
чайниковость на этот раз?
Спасибо за внимание.