1

我正在修改一个适用于某些外部硬件的 Windows 桌面应用程序。当用户从应用程序激活硬件时,会启动一个进度 (UI) 表单。这种形式创建了一个线程来执行硬件的所有工作。当我尝试将进度报告回 UI 线程时,问题就出现了。看来我的第一个 Control.BeginInvoke (“协商消息”)工作正常。但是,第二个(对进度条的第一次调整)似乎从未将其称为委托,因此应用程序锁定在后续的 endinvoke 上。我认为问题在于 GUI 现在处于空闲状态,但我不确定如何解决这种情况。任何帮助,将不胜感激。代码如下:

在 UI 加载方法线程中:

    private void frmTwainAquire_Load(object sender, EventArgs e)
    {
        try
        {
            //Show the GUI
            this.Visible = showGUI;
            pbScanningProgress.Value = 0;
            btnCancel.Enabled = false;
            btnCancel.Visible = false;

            // Set the delegates.
            SetScanMessageDelegate = new SetScanMessage(this.SetScanMessageMethod);
            SetRegistrationMessageDelegate = new SetRegistrationMessage(this.SetRegistrationMessageMethod);
            AddScanProgressDelegate = new AddScanProgress(this.AddScanProgressMethod);
            AddRecogProgressDelegate = new AddRecogProgress(this.AddRecogProgressMethod);

            // Set progress bars.
            pbScanningProgress.Value = 0;
            pbRecognition.Value = 0;
            abortScan = false;

            // Create thread here!
            twainInstance = new rScan.Twain();
            rScanning = new rScanThread(this, twainInstance);

            // Start the thread.
            rScanning.tScan = new Thread(rScanning.Scan);
            rScanning.tScan.Start();

        }
        catch (Exception ex)
        {
            // Error checking here.
        }
    }

委托方法:

public void SetScanMessageMethod(string scanMessage)
    {
        this.lblScanMessage.Text = scanMessage;
    }

    public void SetRegistrationMessageMethod(string recogMessage)
    {
        this.lblRecognition.Text = recogMessage;
    }

    public void AddScanProgressMethod(int progress)
    {
        this.pbScanningProgress.Value += progress;
    }

    public void AddRecogProgressMethod(int progress)
    {
        this.pbRecognition.Value += progress;
    }

给出问题的线程方法。请注意,线程与前两个代码块(都在 UI 类中)位于不同的类中: public class rScanThread : IMessageFilter

public void Scan()
    {
        // Set progress bar message.
        IAsyncResult result;
        if (frmTwainAquireInstance.lblScanMessage.IsHandleCreated && frmTwainAquireInstance.lblScanMessage.InvokeRequired)
        {
            result = frmTwainAquireInstance.lblScanMessage.BeginInvoke(frmTwainAquireInstance.SetScanMessageDelegate, "Negotiating Capabilities with Scanner.");
            frmTwainAquireInstance.lblScanMessage.EndInvoke(result);
        }
        else
        {
            frmTwainAquireInstance.lblScanMessage.Text = "Negotiating Capabilities with Scanner.";
        }

        // Start the intialization of the rScan process.
        bool intializeSuccess = twainInstance.Initialize(frmTwainAquireInstance.Handle);

        // If the process could not be started then quit.
        if (!intializeSuccess)
        {
            frmTwainAquireInstance.Close();
            return;
        }

        if (frmTwainAquireInstance.pbScanningProgress.IsHandleCreated && frmTwainAquireInstance.pbScanningProgress.InvokeRequired)
        {
            result = frmTwainAquireInstance.pbScanningProgress.BeginInvoke(frmTwainAquireInstance.AddScanProgressDelegate, 33);
            frmTwainAquireInstance.pbScanningProgress.EndInvoke(result);  // Lock up here.
        }
        else
        {
            frmTwainAquireInstance.pbScanningProgress.Value += 33;
        }

      // Do more work after.  The code never makes it this far.

    } // End of rScanThread.Scan()
4

0 回答 0