Eric,<br><br>The most performant option I&#39;m aware of is reading the dataset directly into a bitmap buffer something like:<br><br>try<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int stride = bitmapData.Stride;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IntPtr buf = bitmapData.Scan0;<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds.ReadRaster(xOff, yOff, width, height, buf, imageWidth, imageHeight, dataType,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channelCount, bandMap, pixelSpace, stride, 1);<br>}<br>finally<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitmap.UnlockBits(bitmapData);<br>}<br>
<br>In this case there&#39;s no internal buffers in the marshalling code used by the C# wrappers. The only challenge here is to ensure that the bitmap buffer should have the same structure as the gdal dataset represents. You could refer to the complete example in the C# wrapper for the details:<br>
<a href="http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALDatasetRasterIO.cs">http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALDatasetRasterIO.cs</a><br><a href="http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALReadDirect.cs">http://trac.osgeo.org/gdal/browser/trunk/gdal/swig/csharp/apps/GDALReadDirect.cs</a><br>
<br>I don&#39;t think if triggering multiple reads for different sections in multiple threads is currently supported by gdal, it might also be driver dependent how the reads are actually implemented by the drivers, however you might anyway try defining separate Dataset objects for the different when performing the read operations, but there might be locks in different places causing the operations to be serialized in effect.<br>
<br>Best regards,<br><br>Tamas<br><br><br><br><div class="gmail_quote">2009/1/8 Eric Domazlicky <span dir="ltr">&lt;<a href="mailto:edomazlicky@gmail.com">edomazlicky@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div>I am developing a tiling application and I was hoping to up the speed a bit by doing some multithreading. What I want to do is start each of 3 ReadRaster calls in seperate threads (using BeginInvoke delegates), then wait for them to complete and build my RGB image (using EndInvoke). I am using the C# wrapper to the GDAL library. This multithreaded approach is showing clear signs of&nbsp;race conditions, with some of the channels not appearing, random crashes etc. If I ensure each thread completes before I go on to read the next Raster Band it works fine.</div>


<div>&nbsp;</div>
<div>Is there anyway to make ReadRaster thread-safe? Maybe by disabling caching which I suspect is the problem.</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<br>_______________________________________________<br>
gdal-dev mailing list<br>
<a href="mailto:gdal-dev@lists.osgeo.org">gdal-dev@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank">http://lists.osgeo.org/mailman/listinfo/gdal-dev</a><br></blockquote></div><br>