如何在我的项目中使用多线程?

时间:2019-04-02 11:28:58

标签: c# ocr

我正在使用C#练习OCR程序,我不是一个编码员,所以我想尽办法。

1-我 OCR 一些pdf文件。

2-我看到了 OCR 的输出。

3-我使用UI按钮进行浏览,然后单击“转换”。

4-我在UI上有一个进度条,但是它没有视觉上的升级,而当我登录progressBar.Value时,我看到它的编号正在更新。

所以我四处搜寻,发现问题是我想停止线程并为Ui创建一个新的线程以进行视觉更新,但是我真的不明白,甚至不知道该怎么做。

有人可以帮我吗?像婴儿的脚步。

我也知道我已经复制并粘贴了很多代码供您查看。

情况如下:

1-类fmMainForm具有progressBarIncrementation函数,负责从processFunctions类中的函数获取增量值。

2- progressBarIncrementation函数的progressBar.Value有待更新,我看到其值已更新。

3-但是在视觉上没有任何更新。我尝试了一些线程代码,但是我不明白。.....

class processFunctions 
    {
        Thread newThread = Thread.CurrentThread;
        private string invoiceNameIndex = "";
        private string invoiceIBANIndex = "";
        private string invoiceNumberIndex = "";
        private string invoiceDateIndex = "";
        private string invoiceSubtotalIndex = "";
        private string invoiceVATIndex = "";
        private string invoiceTotalIndex = "";
        private string[] filePath;
        private string[] fileNamePDF;
        private int totalNumberOfFiles;

        private string InformationNeeded(string wholeRead, string ix)
        {

            string[] lines = wholeRead.Split(new[] { "\r\n", "\r", "\n", " " }, StringSplitOptions.None);
            if(ix.Contains(","))
            {
                string[] variableIndex = ix.Split(',');
                string name = "";
                for(int i =0; i < variableIndex.Length; i++)
                {
                    name += lines[Convert.ToInt32(variableIndex[i])]; 
                }
                return name;
            }

            return lines[Convert.ToInt32(ix)];
        }

        public void ocrFunction(string filePathOnly)
        {

            var Ocr = new AutoOcr();
            var Results = Ocr.ReadPdf(filePathOnly);
            var Barcodes = Results.Barcodes;
            var Text = Results.Text;
            string[] numbers = { invoiceNameIndex, invoiceIBANIndex, invoiceNumberIndex,
                invoiceDateIndex, invoiceSubtotalIndex, invoiceVATIndex, invoiceTotalIndex};
            string[] results = new string[numbers.Count()];

            for (int i = 0; i < numbers.Length; i++)
            {
                results[i] = InformationNeeded(Text, numbers[i]);
                Console.WriteLine(results[i]);
            }
            Results = null;
            Ocr = null;
            Barcodes = null;
            Text = null;

        }

        public int browseFile()
        {
            Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
            OpenFileDialog ofd = new OpenFileDialog();
            int numberOfFilesToBeProcessed = 0;
            ofd.Filter = "PDF|*.pdf";
            ofd.Multiselect = true;
            string[] name = new string[2];

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                numberOfFilesToBeProcessed = ofd.FileNames.Length;
                filePath = ofd.FileNames;
                fileNamePDF = ofd.SafeFileNames;
            }
            this.totalNumberOfFiles = ofd.FileNames.Length;
            return numberOfFilesToBeProcessed;
        }

        public void databaseReader()
        {

            string connectionString;
            SqlConnection connection;
            connectionString = ConfigurationManager.ConnectionStrings["OCR_App.Properties.Settings.LibraryConnectionString"].ConnectionString;


            for (int i = 0; i < fileNamePDF.Length; i++)
            {

                string fileNameFiltered = fileNamePDF[i].Replace(".pdf", "");

                using (connection = new SqlConnection(connectionString))
                using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM invoicesTable WHERE invoiceRef = '" + fileNameFiltered + "'", connection))
                {
                    DataTable invoicesTable = new DataTable();
                    adapter.Fill(invoicesTable);

                    DataRow index = invoicesTable.Rows[0];

                    invoiceNameIndex = (index[1].ToString());
                    invoiceIBANIndex = (index[2].ToString());
                    invoiceNumberIndex = (index[3].ToString());
                    invoiceDateIndex = (index[4].ToString());
                    invoiceSubtotalIndex = (index[5].ToString());
                    invoiceVATIndex = (index[6].ToString());
                    invoiceTotalIndex = (index[7].ToString());

                    ocrFunction(filePath[i]);
                    //newThread.Start();
                    fmMain formFunctions = new fmMain();
                    //Thread.Yield();

                    //Thread thread = new Thread(() => formFunctions.ProgressBarIncrementation(progressBarIncrement()));
                    formFunctions.ProgressBarIncrementation(progressBarIncrement());

                }
            }
        }
        public int progressBarIncrement()
        {
            int incrementValue = 0;
            incrementValue = incrementValue + 100 / totalNumberOfFiles;
            //Console.WriteLine(incrementValue);
            return incrementValue;
        }
///////////////////////////////////////////////////////////////////
public partial class fmMain : Form
    {
        processFunctions processingMain = new processFunctions();
        ProgressBar NewprogressBar = new ProgressBar();
        private static int incrementbar = 0;

        public fmMain()
        {
            InitializeComponent();
        }

        [STAThread]
        private void BtnBrowse_Click(object sender, EventArgs e)
        //Browse the file needed to scan.
        {            
            int number = processingMain.browseFile();
            txtBoxFilePath.Text = number.ToString();
        }

        public void BtnConvert_Click(object sender, EventArgs e)
        {
            processingMain.databaseReader(); 
        }

        private void fmMain_Load(object sender, EventArgs e)
        {
        }

        private void txtBoxFilePath_TextChanged(object sender, EventArgs e)
        { 
        }

        private void NumberOfFilesToBeProcessed_Click(object sender, 
        EventArgs e)
        {
        }

        public void progressBar_Click(object sender, EventArgs e)
        {

            progressBar.Maximum = 100;
            NewprogressBar.Value = progressBar.Value;

        }
        public void ProgressBarIncrementation(int incrementValue)
        {
            //Thread.Yield();
            //Thread newThread = Thread.CurrentThread;

            incrementbar = incrementbar + incrementValue;
            progressBar.Visible = true;
            progressBar.Value += incrementbar;
            Thread thread = new Thread(() => progressBar.Value += incrementbar);
            Console.WriteLine(progressBar.Value);


            //progressBar.Value += incrementbar;

        }
    }

1 个答案:

答案 0 :(得分:-1)

如果需要进度条,则可能需要考虑创建一个事件,以帮助向呼叫应用程序报告进度。然后,您需要将功能browserFile标记为异步并执行以下操作:

public async Task<int> browseFileAsync()
{
    await Task.Run(new Action(() => { 
    OpenFileDialog ofd = new OpenFileDialog();
    int numberOfFilesToBeProcessed = 0;
    ofd.Filter = "PDF|*.pdf";
    ofd.Multiselect = true;
    string[] name = new string[2];
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            numberOfFilesToBeProcessed = ofd.FileNames.Length;
            filePath = ofd.FileNames;
            fileNamePDF = ofd.SafeFileNames;
        }
        this.totalNumberOfFiles = ofd.FileNames.Length;
        return numberOfFilesToBeProcessed;

              }));
    }

然后在调用应用程序中执行:

        private async void BtnBrowse_Click(object sender, EventArgs e)
    //Browse the file needed to scan.
    {          
        int number = await processMain.browseFileAsync();
        txtBoxFilePath.Text = number.ToString();
    }

我还将考虑不从您的类中调用文件夹浏览器对话框,因为这会将您的类耦合到特定的实现。相反,我将从GUI浏览文件,然后将所选文件传递给类。