Link to home
Start Free TrialLog in
Avatar of derekthornton
derekthornton

asked on

Threading Issue

Alright. I'm trying to thread something ..and it's worked pretty good so far. This procedure works just fine without threading, but when I run the threading, it tells me that the Main function is already in use elsewhere. Has anyone experienced this before? The code is a little long to put on here... But the problem seems to be with the main thread, not the actual thread.
Avatar of derekthornton
derekthornton

ASKER

As long as it is..Here is the code for the file that is giving me issues.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
I owe too much to this forum. But I am learning fast.
------------------------------------------------------------------------------

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Threading;

namespace OCR
{
      /// <summary>
      /// Summary description for Viewer.
      /// </summary>
      public class Viewer : System.Windows.Forms.Form
      {
            #region Windows Designer Variables
            private DevComponents.DotNetBar.DotNetBarManager menu;
            private DevComponents.DotNetBar.DockSite barLeftDockSite;
            private DevComponents.DotNetBar.DockSite barRightDockSite;
            private DevComponents.DotNetBar.DockSite barTopDockSite;
            private DevComponents.DotNetBar.DockSite barBottomDockSite;
            private System.Windows.Forms.ImageList imageList1;
            private System.Windows.Forms.Splitter splitter1;
            private System.ComponentModel.IContainer components;
            private OCR.ImageControl ImageControl;
            #endregion

            #region Instance Variables

            private const short mIP = 0;
            private const short mRP = 1;

            private const short mOCRSTATE_IDLE = 0;
            private const short mOCRSTATE_ACTIVE = 1;
            private const short mOCRSTATE_ABORT = 2;
            private const short mOCRSTATE_END = 3;
            private System.Windows.Forms.RichTextBox rtfBox;
            private System.Windows.Forms.Splitter splitter2;
            private System.Windows.Forms.ListBox lstPicture;

            private ImageInfo Picture = new ImageInfo();

            private PANEINFO[] mPane = new PANEINFO[mRP];
            private ImageBatch ImageBatch = new ImageBatch();

            private Rectangle theRectangle = new Rectangle
                  (new Point(0, 0), new Size(0, 0));

            Thread OCRThread;

            #endregion

            #region Form Methods

            public Viewer()
            {
                  InitializeComponent();
                  Picture.Viewer = this.ImageControl;
            }

            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                  if( disposing )
                  {
                        if(components != null)
                        {
                              components.Dispose();
                        }
                  }
                  base.Dispose( disposing );
            }

            public static void Main()
            {
                  Application.Run(new Viewer());
            }

            #endregion

            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                  this.components = new System.ComponentModel.Container();
                  System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Viewer));
                  this.menu = new DevComponents.DotNetBar.DotNetBarManager(this.components);
                  this.barBottomDockSite = new DevComponents.DotNetBar.DockSite();
                  this.imageList1 = new System.Windows.Forms.ImageList(this.components);
                  this.barLeftDockSite = new DevComponents.DotNetBar.DockSite();
                  this.barRightDockSite = new DevComponents.DotNetBar.DockSite();
                  this.barTopDockSite = new DevComponents.DotNetBar.DockSite();
                  this.ImageControl = new OCR.ImageControl();
                  this.splitter1 = new System.Windows.Forms.Splitter();
                  this.rtfBox = new System.Windows.Forms.RichTextBox();
                  this.splitter2 = new System.Windows.Forms.Splitter();
                  this.lstPicture = new System.Windows.Forms.ListBox();
                  this.SuspendLayout();
                  //
                  // menu
                  //
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.F1);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.CtrlC);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.CtrlA);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.CtrlV);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.CtrlX);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.CtrlZ);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.Del);
                  this.menu.AutoDispatchShortcuts.Add(DevComponents.DotNetBar.eShortcut.Ins);
                  this.menu.BottomDockSite = this.barBottomDockSite;
                  this.menu.DefinitionName = "Viewer.menu.xml";
                  this.menu.Images = this.imageList1;
                  this.menu.ImagesLarge = null;
                  this.menu.ImagesMedium = null;
                  this.menu.LeftDockSite = this.barLeftDockSite;
                  this.menu.ParentForm = this;
                  this.menu.RightDockSite = this.barRightDockSite;
                  this.menu.TopDockSite = this.barTopDockSite;
                  this.menu.ItemClick += new System.EventHandler(this.menu_ItemClick);
                  //
                  // barBottomDockSite
                  //
                  this.barBottomDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window;
                  this.barBottomDockSite.BackgroundImageAlpha = ((System.Byte)(255));
                  this.barBottomDockSite.Dock = System.Windows.Forms.DockStyle.Bottom;
                  this.barBottomDockSite.Location = new System.Drawing.Point(0, 405);
                  this.barBottomDockSite.Name = "barBottomDockSite";
                  this.barBottomDockSite.Size = new System.Drawing.Size(622, 21);
                  this.barBottomDockSite.TabIndex = 3;
                  this.barBottomDockSite.TabStop = false;
                  //
                  // imageList1
                  //
                  this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
                  this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
                  this.imageList1.TransparentColor = System.Drawing.Color.Magenta;
                  //
                  // barLeftDockSite
                  //
                  this.barLeftDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window;
                  this.barLeftDockSite.BackgroundImageAlpha = ((System.Byte)(255));
                  this.barLeftDockSite.Dock = System.Windows.Forms.DockStyle.Left;
                  this.barLeftDockSite.Location = new System.Drawing.Point(0, 49);
                  this.barLeftDockSite.Name = "barLeftDockSite";
                  this.barLeftDockSite.Size = new System.Drawing.Size(0, 356);
                  this.barLeftDockSite.TabIndex = 0;
                  this.barLeftDockSite.TabStop = false;
                  //
                  // barRightDockSite
                  //
                  this.barRightDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window;
                  this.barRightDockSite.BackgroundImageAlpha = ((System.Byte)(255));
                  this.barRightDockSite.Dock = System.Windows.Forms.DockStyle.Right;
                  this.barRightDockSite.Location = new System.Drawing.Point(622, 49);
                  this.barRightDockSite.Name = "barRightDockSite";
                  this.barRightDockSite.Size = new System.Drawing.Size(0, 356);
                  this.barRightDockSite.TabIndex = 1;
                  this.barRightDockSite.TabStop = false;
                  //
                  // barTopDockSite
                  //
                  this.barTopDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window;
                  this.barTopDockSite.BackgroundImageAlpha = ((System.Byte)(255));
                  this.barTopDockSite.Dock = System.Windows.Forms.DockStyle.Top;
                  this.barTopDockSite.Location = new System.Drawing.Point(0, 0);
                  this.barTopDockSite.Name = "barTopDockSite";
                  this.barTopDockSite.Size = new System.Drawing.Size(622, 49);
                  this.barTopDockSite.TabIndex = 2;
                  this.barTopDockSite.TabStop = false;
                  //
                  // ImageControl
                  //
                  this.ImageControl.AutoScroll = true;
                  this.ImageControl.BackColor = System.Drawing.SystemColors.Desktop;
                  this.ImageControl.Dock = System.Windows.Forms.DockStyle.Left;
                  this.ImageControl.Image = null;
                  this.ImageControl.ImageSizeMode = OCR.SizeMode.Scrollable;
                  this.ImageControl.Location = new System.Drawing.Point(0, 49);
                  this.ImageControl.Name = "ImageControl";
                  this.ImageControl.Size = new System.Drawing.Size(460, 356);
                  this.ImageControl.TabIndex = 4;
                  //
                  // splitter1
                  //
                  this.splitter1.Location = new System.Drawing.Point(460, 49);
                  this.splitter1.Name = "splitter1";
                  this.splitter1.Size = new System.Drawing.Size(3, 356);
                  this.splitter1.TabIndex = 5;
                  this.splitter1.TabStop = false;
                  //
                  // rtfBox
                  //
                  this.rtfBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                  this.rtfBox.Dock = System.Windows.Forms.DockStyle.Top;
                  this.rtfBox.Location = new System.Drawing.Point(463, 49);
                  this.rtfBox.Name = "rtfBox";
                  this.rtfBox.Size = new System.Drawing.Size(159, 96);
                  this.rtfBox.TabIndex = 6;
                  this.rtfBox.Text = "";
                  //
                  // splitter2
                  //
                  this.splitter2.Dock = System.Windows.Forms.DockStyle.Top;
                  this.splitter2.Location = new System.Drawing.Point(463, 145);
                  this.splitter2.Name = "splitter2";
                  this.splitter2.Size = new System.Drawing.Size(159, 3);
                  this.splitter2.TabIndex = 7;
                  this.splitter2.TabStop = false;
                  //
                  // lstPicture
                  //
                  this.lstPicture.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                  this.lstPicture.Dock = System.Windows.Forms.DockStyle.Fill;
                  this.lstPicture.Location = new System.Drawing.Point(463, 148);
                  this.lstPicture.Name = "lstPicture";
                  this.lstPicture.Size = new System.Drawing.Size(159, 249);
                  this.lstPicture.TabIndex = 8;
                  //
                  // Viewer
                  //
                  this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                  this.ClientSize = new System.Drawing.Size(622, 426);
                  this.Controls.Add(this.lstPicture);
                  this.Controls.Add(this.splitter2);
                  this.Controls.Add(this.rtfBox);
                  this.Controls.Add(this.splitter1);
                  this.Controls.Add(this.ImageControl);
                  this.Controls.Add(this.barLeftDockSite);
                  this.Controls.Add(this.barRightDockSite);
                  this.Controls.Add(this.barTopDockSite);
                  this.Controls.Add(this.barBottomDockSite);
                  this.Name = "Viewer";
                  this.Text = "Viewer";
                  this.Resize += new System.EventHandler(this.Viewer_Resize);
                  this.Load += new System.EventHandler(this.Viewer_Load);
                  this.Layout += new System.Windows.Forms.LayoutEventHandler(this.Viewer_Layout);
                  this.Paint += new System.Windows.Forms.PaintEventHandler(this.Viewer_Paint);
                  this.ResumeLayout(false);

            }
            #endregion

            #region Menu Commands
            private void menu_ItemClick(object sender, System.EventArgs e)
            {
                  BaseItem item = sender as BaseItem;
                  switch(item.Name)
                  {
                        case "bOpen":
                              OpenPicture();
                              break;
                        case "bClose":
                              break;
                        case "bSave":
                              break;
                        case "bSaveAs":
                              break;
                        case "bBatch":
                              BatchDialog();
                              break;
                        case "bScrollable":
                              this.ImageControl.SetScrollable();
                              break;
                        case "bRatio":
                              this.ImageControl.SetRatioStretch();
                              break;
                        case "bOCRPage":
                              OCRPage();
                              break;
                        case "bOCRSelection":
                              OCRArea();
                              break;
                        case "bBatchSelection":
                              BatchSelection();
                              break;
                        case "bOCRPageThread":
                              OCRPageThreaded();
                              break;
                        case "bOCRSelectionThreaded":
                              OCRSelectionThreaded();
                              break;
                  }
            }
            #endregion

            #region OCR Class For Threading

            public class BatchProcess
            {
                  #region Instance Variables ( for Batch Class )

                  ImageBatch iBatch;
                  ImageControl iControl;
                  ImageInfo Picture;
                  DotNetBarManager menu;
                  ListBox lstPicture;
                  RichTextBox rtfBox;

                  #endregion

                  #region BatchProcess Constructor
                  public BatchProcess(ImageBatch image,ImageControl control,
                        ImageInfo Pic,DotNetBarManager mnu,ListBox lst,RichTextBox rtf)
                  {
                        iBatch = image;
                        iControl = control;
                        Picture = Pic;
                        menu = mnu;
                        lstPicture = lst;
                        rtfBox = rtf;
                  }
                  #endregion

                  #region External Methods for Instantiating Batch Processing

                  public void ExecuteBatch()
                  {
                        BatchDialog();
                  }
                  public void ExecuteSelectionBatch()
                  {
                        BatchSelection();
                  }

                  #endregion

                  #region BatchDialog (Whole Page) Process
                  public void BatchDialog()
                  {
                        iBatch.Viewer = iControl;
                        BatchProcessor Batch = new BatchProcessor(iBatch);
                        Batch.ShowDialog();
                  
                        #region Loop For the Batch Process
                        if(Batch.DialogResult != DialogResult.Cancel)
                        {
                              Int32 BatchLength = iBatch.Picture.Length - 1;

                              for(int i = 0; i <= BatchLength;i++)
                              {
                                    API.TOCRInitialise(ref iBatch.Picture[i].JobNo);
                                    iBatch.Picture[i].JobInfo.JobType =
                                          OCRuser.TOCRJOBTYPE_DIBFILE;
                                    PerformOCR(iBatch.Picture[i]);
                              }
                  
                              #region Set all 'Picture' Values to Last Item of Batch
                              Picture = new ImageInfo();

                              Picture.Filename =
                                    iBatch.Picture[BatchLength].Filename;

                              Picture.Image =
                                    iBatch.Picture[BatchLength].Image;

                              Picture.FileFormat =
                                    iBatch.Picture[BatchLength].FileFormat;

                              Picture.Viewer =
                                    iBatch.Picture[BatchLength].Viewer;
                              #endregion
                        }
                        #endregion
                  }
                  #endregion


                  #region Batch Selection (For A Selected Area)
                  public void BatchSelection()
                  {
                        iBatch.Viewer = iControl;
                        BatchProcessor Batch = new BatchProcessor(iBatch);
                        Batch.ShowDialog();
                  
                        if(Batch.DialogResult != DialogResult.Cancel)
                        {
                              Int32 BatchLength = iBatch.Picture.Length - 1;

                              #region Loop for Batch Process
                              for(int i = 0; i <= BatchLength;i++)
                              {
                                    API.TOCRInitialise(ref iBatch.Picture[i].JobNo);

                                    iBatch.Picture[i].Viewer = iControl;

                                    Methods.HandleFile(iBatch.Picture[i]);      
                        
                                    iControl.OCRSelection(iBatch.Picture[i]);
      
                                    Methods.CreateSelectionMMFile(iBatch.Picture[i]);

                                    iBatch.Picture[i].JobInfo.JobType =
                                          OCRuser.TOCRJOBTYPE_DIBFILE;

                                    PerformOCR(iBatch.Picture[i]);
                              }
                              #endregion
                  
                              #region Set 'Picture' Object to Last Item of Batch
                              Picture = new ImageInfo();

                              Picture.Filename =
                                    iBatch.Picture[BatchLength].Filename;

                              Picture.Image =
                                    iBatch.Picture[BatchLength].Image;

                              Picture.FileFormat =
                                    iBatch.Picture[BatchLength].FileFormat;

                              Picture.Viewer =
                                    iBatch.Picture[BatchLength].Viewer;
                              #endregion
                        }
                  }
                  #endregion

                  #region OCR Method (Most Important!!)
                  private void PerformOCR(ImageInfo Picture)
                  {
                        LabelItem lblStatus = menu.GetItem("lblStatus") as LabelItem;
                        lblStatus.Text = "Performing Recognition";

                        Picture.JobStatus =
                              API.TOCRDoJob(Picture.JobNo,
                              ref Picture.JobInfo);
                        
                        if ( API.TOCRGetJobStatus(Picture.JobNo,ref Picture.JobStatus) == 0 )
                        {
                              do
                              {
                                    lblStatus.Text = "Fetching Job Status";

                                    API.TOCRGetJobStatus
                                          (Picture.JobNo,ref Picture.JobStatus);
                              }
                              while( Picture.JobStatus == 0);
                        }
                        else
                        {
                              lblStatus.Text = "Waiting For Job";

                              API.TOCRWaitForJob
                                    (Picture.JobNo,ref Picture.JobStatus);
                        }
                        if ( Picture.JobStatus == OCRuser.TOCRJOBSTATUS_DONE )
                        {
                              lblStatus.Text = "Job Done.Allocating Results";

                              Picture.ResultsHeaderSize =
                                    Marshal.SizeOf(typeof(TOCRResultsHeader));

                              lblStatus.Text = "Header Size: " +
                                    Picture.ResultsHeaderSize.ToString();

                              lstPicture.Items.Add("Header Size: " +
                                    Picture.ResultsHeaderSize.ToString());

                              Picture.ResultsItemSize =
                                    Marshal.SizeOf(typeof(TOCRResultsItem));

                              lblStatus.Text = "Item Size: " +
                                    Picture.ResultsItemSize.ToString();

                              lstPicture.Items.Add("Item Size: " +
                                    Picture.ResultsItemSize.ToString());

                              API.TOCRGetJobResults(Picture.JobNo,
                                    ref Picture.numberOfBytes, IntPtr.Zero);

                              Picture.ptAddress = IntPtr.Zero;
                              Picture.ptAddress =
                                    Marshal.AllocHGlobal(Picture.numberOfBytes);

                              this.lstPicture.Items.Add("ptAddress: " +
                                    Picture.ptAddress.ToString());

                              API.TOCRGetJobResults(Picture.JobNo,
                                    ref Picture.numberOfBytes, Picture.ptAddress);
                        
                              TOCRResultsHeader hdr = (TOCRResultsHeader)Marshal.PtrToStructure
                                    (Picture.ptAddress,  typeof(TOCRResultsHeader));
                        
                              Picture.numItems =
                                    (Picture.numberOfBytes - Picture.ResultsHeaderSize) /
                                    Picture.ResultsItemSize;

                              lblStatus.Text = "Number of Items: " + Picture.numItems.ToString();
                              lstPicture.Items.Add("Number of Items: " +
                                    Picture.numItems.ToString());

                              Picture.ResultsItemAddress = (IntPtr)((int)Picture.ptAddress +
                                    Picture.ResultsHeaderSize);
                        
                              TOCRResultsItem item = new TOCRResultsItem();

                              for(int i = 0;
                                    i < Picture.numItems;
                                    i++ )
                              {
                                    Picture.AddressOfItem =
                                          (IntPtr)((int)Picture.ResultsItemAddress +
                                          i * Picture.ResultsItemSize);

                                    item =
                                          (TOCRResultsItem)Marshal.PtrToStructure
                                          (Picture.AddressOfItem,
                                          typeof(TOCRResultsItem));

                                    if( (char)item.OCRCha == '\r' )
                                    {
                                          Picture.strResults += "\r";
                                    }
                                    else
                                    {
                                          Picture.strResults += (char)item.OCRCha;
                                    }
                              }
                        }
                        #region Finalize and Clear Everything
                        rtfBox.Text += Picture.strResults;
                        Picture.strResults = "";
                        rtfBox.Text += "\n<-- End of File -->\n";
                        Marshal.FreeHGlobal(Picture.ptAddress);
                        API.TOCRShutdown(Picture.JobNo);
                        #endregion
                  }
            }
            #endregion

                  #region Methods for Performing the OCR
            private void OCRPageThreaded()
            {
                  OCRThread = new Thread(new ThreadStart(new BatchProcess
                        (ImageBatch,this.ImageControl,this.Picture,
                        this.menu,this.lstPicture,this.rtfBox).ExecuteBatch));
                  OCRThread.Start();
            }
            private void OCRSelectionThreaded()
            {
                  OCRThread = new Thread(new ThreadStart(new BatchProcess
                        (ImageBatch,this.ImageControl,this.Picture,
                        this.menu,this.lstPicture,this.rtfBox).ExecuteSelectionBatch));
                  OCRThread.Start();
            }
            #endregion

            #endregion

            #region Batch Commands

            private void BatchDialog()
            {
                  ImageBatch.Viewer = this.ImageControl;
                  BatchProcessor Batch = new BatchProcessor(ImageBatch);
                  Batch.ShowDialog();
                  
                  if(Batch.DialogResult != DialogResult.Cancel)
                  {
                        Int32 BatchLength = ImageBatch.Picture.Length - 1;

                        for(int i = 0; i <= BatchLength;i++)
                        {
                              API.TOCRInitialise(ref ImageBatch.Picture[i].JobNo);
                              ImageBatch.Picture[i].JobInfo.JobType =
                                    OCRuser.TOCRJOBTYPE_DIBFILE;
                              PerformOCR(ImageBatch.Picture[i]);
                        }
                  
                        Picture = new ImageInfo();

                        Picture.Filename =
                              ImageBatch.Picture[BatchLength].Filename;

                        Picture.Image =
                              ImageBatch.Picture[BatchLength].Image;

                        Picture.FileFormat =
                              ImageBatch.Picture[BatchLength].FileFormat;

                        Picture.Viewer =
                              ImageBatch.Picture[BatchLength].Viewer;
                  }
            }

            private void BatchSelection()
            {
                  ImageBatch.Viewer = this.ImageControl;
                  BatchProcessor Batch = new BatchProcessor(ImageBatch);
                  Batch.ShowDialog();
                  
                  if(Batch.DialogResult != DialogResult.Cancel)
                  {
                        Int32 BatchLength = ImageBatch.Picture.Length - 1;

                        for(int i = 0; i <= BatchLength;i++)
                        {
                              API.TOCRInitialise(ref ImageBatch.Picture[i].JobNo);

                              ImageBatch.Picture[i].Viewer = this.ImageControl;

                              Methods.HandleFile(ImageBatch.Picture[i]);      
                        
                              this.ImageControl.OCRSelection(ImageBatch.Picture[i]);
      
                              Methods.CreateSelectionMMFile(ImageBatch.Picture[i]);

                              ImageBatch.Picture[i].JobInfo.JobType =
                                    OCRuser.TOCRJOBTYPE_DIBFILE;

                              PerformOCR(ImageBatch.Picture[i]);
                        }
                  
                        Picture = new ImageInfo();

                        Picture.Filename =
                              ImageBatch.Picture[BatchLength].Filename;

                        Picture.Image =
                              ImageBatch.Picture[BatchLength].Image;

                        Picture.FileFormat =
                              ImageBatch.Picture[BatchLength].FileFormat;

                        Picture.Viewer =
                              ImageBatch.Picture[BatchLength].Viewer;
                  }
            }
            #endregion

            #region Image Methods

            private void OpenPicture()
            {
                  Picture.Filename =
                        this.ImageControl.OpenNewPicture();

                  Methods.HandleFile(Picture);

                  LabelItem lblFileType = menu.GetItem("lblFileType") as LabelItem;
                  lblFileType.Text = Picture.FileFormat;

                  lstPicture.Items.Add("Filename: " + Picture.Filename.Substring
                        (Picture.Filename.LastIndexOf(@"\")+1,
                        Picture.Filename.Length -
                        Picture.Filename.LastIndexOf(@"\")-1));

                  lstPicture.Items.Add("Format: " + Picture.FileFormat);
            }
            #endregion

            #region OCR Methods
            private void OCRArea()
            {
                  API.TOCRInitialise(ref Picture.JobNo);

                  this.ImageControl.OCRSelection(Picture);

                  lstPicture.Items.Add("Selection: " +
                        Picture.Selected.ToString());
                  Methods.CreateSelectionMMFile(Picture);

                  Picture.JobInfo.JobType = OCRuser.TOCRJOBTYPE_DIBFILE;
                  PerformOCR(Picture);
            }

            private void OCRPage()
            {
                  API.TOCRInitialise(ref Picture.JobNo);
                  Methods.CreateMMFile(Picture);

                  Picture.JobInfo.JobType = OCRuser.TOCRJOBTYPE_DIBFILE;
                  PerformOCR(Picture);
            }
            private void PerformOCR(ImageInfo Picture)
            {
                  LabelItem lblStatus = menu.GetItem("lblStatus") as LabelItem;
                  lblStatus.Text = "Performing Recognition";

                  Picture.JobStatus =
                        API.TOCRDoJob(Picture.JobNo,
                        ref Picture.JobInfo);
                        
                  if ( API.TOCRGetJobStatus(Picture.JobNo,ref Picture.JobStatus) == 0 )
                  {
                        do
                        {
                              lblStatus.Text = "Fetching Job Status";

                              API.TOCRGetJobStatus
                                    (Picture.JobNo,ref Picture.JobStatus);
                        }
                        while( Picture.JobStatus == 0);
                  }
                  else
                  {
                        lblStatus.Text = "Waiting For Job";

                        API.TOCRWaitForJob
                              (Picture.JobNo,ref Picture.JobStatus);
                  }
                  if ( Picture.JobStatus == OCRuser.TOCRJOBSTATUS_DONE )
                  {
                        lblStatus.Text = "Job Done.Allocating Results";

                        Picture.ResultsHeaderSize =
                              Marshal.SizeOf(typeof(TOCRResultsHeader));

                        lblStatus.Text = "Header Size: " +
                              Picture.ResultsHeaderSize.ToString();

                        lstPicture.Items.Add("Header Size: " +
                              Picture.ResultsHeaderSize.ToString());

                        Picture.ResultsItemSize =
                              Marshal.SizeOf(typeof(TOCRResultsItem));

                        lblStatus.Text = "Item Size: " +
                              Picture.ResultsItemSize.ToString();

                        lstPicture.Items.Add("Item Size: " +
                              Picture.ResultsItemSize.ToString());

                        API.TOCRGetJobResults(Picture.JobNo,
                              ref Picture.numberOfBytes, IntPtr.Zero);

                        Picture.ptAddress = IntPtr.Zero;
                        Picture.ptAddress =
                              Marshal.AllocHGlobal(Picture.numberOfBytes);

                        this.lstPicture.Items.Add("ptAddress: " +
                              Picture.ptAddress.ToString());

                        API.TOCRGetJobResults(Picture.JobNo,
                              ref Picture.numberOfBytes, Picture.ptAddress);
                        
                        TOCRResultsHeader hdr = (TOCRResultsHeader)Marshal.PtrToStructure
                              (Picture.ptAddress,  typeof(TOCRResultsHeader));
                        
                        Picture.numItems =
                              (Picture.numberOfBytes - Picture.ResultsHeaderSize) /
                              Picture.ResultsItemSize;

                        lblStatus.Text = "Number of Items: " + Picture.numItems.ToString();
                        lstPicture.Items.Add("Number of Items: " +
                              Picture.numItems.ToString());

                        Picture.ResultsItemAddress = (IntPtr)((int)Picture.ptAddress +
                              Picture.ResultsHeaderSize);
                        
                        TOCRResultsItem item = new TOCRResultsItem();

                        for(int i = 0;
                              i < Picture.numItems;
                              i++ )
                        {
                              Picture.AddressOfItem =
                                    (IntPtr)((int)Picture.ResultsItemAddress +
                                    i * Picture.ResultsItemSize);

                              item =
                                    (TOCRResultsItem)Marshal.PtrToStructure
                                    (Picture.AddressOfItem,
                                    typeof(TOCRResultsItem));

                              if( (char)item.OCRCha == '\r' )
                              {
                                    Picture.strResults += "\r";
                              }
                              else
                              {
                                    Picture.strResults += (char)item.OCRCha;
                              }
                        }
                  }
                  rtfBox.Text += Picture.strResults;
                  Picture.strResults = "";
                  rtfBox.Text += "\n<-- End of File -->\n";
                  Marshal.FreeHGlobal(Picture.ptAddress);
                  API.TOCRShutdown(Picture.JobNo);
            }

            #endregion

            #region Event Handlers

            private void Viewer_Load(object sender, System.EventArgs e)
            {
                  this.ImageControl.Width = this.Width - 250;
                  this.rtfBox.Height = this.Height - 300;

                  Int32 PNo;

                  if(API.TOCRSetErrorMode(OCRuser.TOCRDEFERRORMODE,
                        OCRuser.TOCRERRORMODE_MSGBOX) != OCRerrs.TOCR_OK)
                        this.Close();

                  this.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

                  for(PNo = mIP;PNo < mRP;PNo++)
                  {
                        mPane[PNo].hDCMem = GDI.CreateCompatibleDC((int)this.Handle);
                        mPane[PNo].BI.hBmp = 0;
                        mPane[PNo].AllowPaint = true;
                        mPane[PNo].Zoom = 100;
                        mPane[PNo].zLeft = 0;
                        mPane[PNo].zTop = 0;
                        mPane[PNo].zWidth = 0;
                        mPane[PNo].zHeight = 0;
                  }
            
                  Picture.JobInfo.StructId = 0;

                  this.Update();
            }

            private void Viewer_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                  this.ImageControl.Width = this.Width - 250;
                  this.rtfBox.Height = this.Height - 300;
            }

            private void Viewer_Resize(object sender, System.EventArgs e)
            {
                  this.ImageControl.Width = this.Width - 250;
                  this.rtfBox.Height = this.Height - 300;
            }

            private void Viewer_Layout(object sender, System.Windows.Forms.LayoutEventArgs e)
            {
                  this.ImageControl.Width = this.Width - 250;
                  this.rtfBox.Height = this.Height - 300;
            }

            public struct BMPINFO
            {
                  public int hBmp;
                  public int Width;
                  public int Height;
                  public int XPelsPerMeter;
                  public int YPelsPerMeter;
                  public int Length;
            }
            public struct PANEINFO
            {
                  public BMPINFO BI;
                  public Int32 hDCMem;
                  public Int32 Zoom;
                  public Int32 zLeft;
                  public Int32 zTop;
                  public Int32 zWidth;
                  public Int32 zHeight;
                  public bool AllowPaint;
            }
            #endregion

      }// Viewer Class
}
Can you post the actual error you got?
An unhandled exception of type 'System.InvalidOperationException' occurred in system.windows.forms.dll

Additional information: The object is currently in use elsewhere.

The cursor is placed at the last curly bracket of the
Public Static Void Main()

method.
Hi derekthornton !
If i undestand this problem correctly, than you have a synchronization problem on your hands.
You accessing some code inside one thread from another thread wile process is still working. To solve this i suggest that you lock part of code that is crytical and must be safe, like this:


               public void ExecuteBatch()
               {
                  lock{
                         BatchDialog();
                        }
               }
               public void ExecuteSelectionBatch()
               {
                  lock{
                        BatchSelection();
                        }
               }
In this case, code is thread safe and it is impossible for two different threads to use this code in the same time.

Hope this will help.
Good Luck!
ASKER CERTIFIED SOLUTION
Avatar of magnus23
magnus23

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
I understand what you're saying, but the above didn't help. So I don't think it was the entire problem. Any other suggestions?
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial