J'ai une application où j'utilise MODI 2007 à OCR plusieurs fichiers tiff multi-page. J'ai trouvé que quand je le lance sur un répertoire qui contient plusieurs bons tiffs mais aussi quelques tiffs qui ne peuvent pas être ouverts dans Windows Picture et Fax Viewer, alors MODI échoue également à OCR ces "mauvais" tiffs. Lorsque cela se produit, l'application est incapable de récupérer toute la mémoire qui a été utilisée par MODI pour OCR ces tiffs. Une fois que l'outil a tenté d'effectuer une ROC trop importante de ces «mauvais» tiffs, la machine manque de mémoire et l'application se bloque. J'ai essayé plusieurs correctifs de code sur le web qui prétendument réparer les fuites de mémoire MODI, mais jusqu'à présent, aucun n'a fonctionné pour moi. Je suis coller dans la partie du code ci-dessous qui fait l'après ROC:MODI fuite de mémoire
StringBuilder strRecText = new StringBuilder(10000);
MODI.Document doc1 = new MODI.Document();
doc1.Create(name);
try
{
doc1.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true); // this will ocr all pages of a multi-page tiff file
}
catch (Exception e)
{
doc1.Close(false); // clean up
if (doc1 != null)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
doc1 = null;
}
}
MODI.Images images = doc1.Images;
for (int imageCounter = 0; imageCounter < images.Count; imageCounter++)
{
if (imageCounter > 0)
{
if (!noPageBreakFlag)
{
strRecText.Append((char)pageBreakChar);
}
}
MODI.Image image = (MODI.Image)images[imageCounter];
MODI.Layout layout = image.Layout;
strRecText.Append(layout.Text);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
if (layout != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(layout);
layout = null;
}
if (image != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(image);
image = null;
}
}
File.AppendAllText(ocrFile, strRecText.ToString()); // write the OCR file out to disk
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
if (images != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(images);
images = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
doc1.Close(false); // clean up
if (doc1 != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
doc1 = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();