1

一部の外部ハードウェアで動作するWindowsデスクトップアプリケーションを変更しています。ユーザーがアプリケーションからハードウェアをアクティブ化すると、進行状況(UI)フォームが開始されます。このフォームは、ハードウェアですべての作業を実行するスレッドを作成します。問題は、進行状況をUIスレッドに報告しようとすると発生します。最初のControl.BeginInvoke(「ネゴシエーションメッセージ」)は正常に機能しているようです。ただし、2番目(プログレスバーの最初の調整)はデリゲートとは呼ばれないようであり、その結果、アプリケーションは後続の終了呼び出しでロックされます。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;
    }

問題を引き起こしているスレッドメソッド。スレッドは前の2つのコードブロック(両方ともUIクラスにあります)とは異なるクラスにあることに注意してください。publicclass 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