我会非常感谢任何帮助。我在Windows 7上通过wxDevC ++使用wxWidgets开发了一个应用程序。我有一个函数可以进行一些计算,并且应该生成一个获取数据的2D颜色图。它看起来像这样:
void draw2DColourPlot (wxDC *dc)
{
wxBitmap bmp;
bmp.Create (800, 400);
wxMemoryDC *memDC = new wxMemoryDC ( bmp );
ofstream dbgStr ( "interpolating.txt", std :: osftream :: out );
int progress = 0;
for ( int i = 0; i < 800; ++i )
{
for ( int j = 0; j < 400; ++j )
{
unsigned char r, g, b,;
// calculate values of r, g, b
memDC -> SetPen ( wxPen ( wxColor (r,g,b), 1 ) );
memDC -> DrawPoint ( i,j );
dbgStr << "Point ( " << i << ", " << j << " ) calculated" << '\n';
++progress;
updateProgressBar ( progress );
}
}
dc -> SetPen ( wxPen ( wxColor ( 255, 255, 255 ), 1 ) );
dc -> Clear ();
dc -> Blit ( 0, 0, 800, 400, memDC, 0, 0 );
return;
}
问题是,有时它不起作用 - 进度条达到某个值(在我观察到的10%到90%之间),然后一切都冻结了几秒钟然后DC变为空白(之前的任何一个)内容消失)。经过几次,可能会得出适当的结果,但这不是一个规则。在“interpolating.txt”文件中,最后一行是“Point(799,399)calculated”。
以前我没有使用wxMemoryDC - 我使用了dc - &gt; DrawPoint()直接观察相同的行为(按预期绘制点,但在某些时候,一切都消失了。)
在我的笔记本电脑(也是W7)上执行时会更频繁地发生,但有时也会在PC上执行。
你有解决方法吗?有没有机会,我错误地使用wxWidgets并且它应该以不同的方式完成?
感谢您的帮助。
答案 0 :(得分:3)
我认为您的问题是由于内存/资源泄漏:您在堆上分配wxMemoryDC
但从不删除它并且泄漏DC特别糟糕,因为它们是Windows下的有限资源,所以如果泄漏太多其中,您将无法再创建任何内容。要解决此问题,请将其分配到堆栈中。
其次,虽然你所做的并没有错,但它的效率非常低。要进行简单的改进,请在wxImage中设置像素,然后立即将其转换为wxBitmap
。要获得更高效的方法,请使用wxPixelData直接在位图中设置像素。这比你的工作要快得多。