0

我在完成 Windows 窗体 C# 中的 GUI 时遇到了瓶颈。我是 100% 的新手,我认为我在混和乱搞。有人可以帮助我吗?

我正在嵌入一个人工视觉应用程序(在 HALCON 软件中开发并导出为 C#)。我在一个类中恢复这个应用程序,其中一种方法具有三个输出(几个图像和一个字符串)。

我将这个类与其他类一起放在一个 while 循环中,以迭代并与视觉应用程序的输出交互,直到状态statusFile为 1 以退出循环。

首先,我只使用平均线程,当 while 循环进入视野时,我的 GUI 没有响应。

开始按钮的片段:

public string pathFile { get; set; } // THIS DATA COMES FROM PREVIOUS WFORM
public DataTable dataLonas { get; set; }
public string namePro { get; set; }

public Thread Run_thread = null, run1 = null;
public static AutoResetEvent myResetEvent
    = new AutoResetEvent(false); // initially set to false.

public VentanaIniciarProceso3()
{
    InitializeComponent();
}

private void button_start_process_Click(object sender, EventArgs e)
{

    string name_button = button_start_process.Text;

    if (name_button == "Start")
    {

        boton_iniciar_proceso1.Text = "Pause"; // CHANGE THE LABEL
                                               // instead having more buttons

        run1 = new Thread(t => //HERE THE NEW THREAD
        {
            while (statusFile == 0) //
            {

                HObject ho_IMAGE_OPERARIOS = null;
                HObject ho_ActualImageTrim = null;
                HTuple hv_READ_OCR_STRING = new HTuple();

                // HALCON CLASS
                (hv_READ_OCR_STRING, ho_ActualImageTrim, ho_IMAGE_OPERARIOS) =
                    LONASapp.action(hv_AcqHandle, hv_AcqHandle_2, pathFile, namePro);

                string codigo = hv_READ_OCR_STRING.ToString();

                // EVAL CODE
                int aux_aviso = EvalCodigoBeta.analizarAvisoBeta(codigo,
                    dataLonas, pathFile, namePro);

                // EVAL FILE CLASSFICHERO.
                // statusFichero para 1 o 0
                // Variable que indique si fuerza operario
                statusFile = EvalFichero.checkCarga(dataLonas, pathFile, namePro);
                statusFile = ContinuarSalirProyecto.continuarSalir(statusFile);

                // IF statusFile==1 It Will exit 
            }
        })
        { IsBackground = true };

        run1.Start(); // START IN BACKGROUND THE LOOP WITH THE CLASSES
    }
    else if (name_button == "Pause")
    {
        myResetEvent.WaitOne(); // SAME BUTTON WITH LABEL CHANGED TRYING
                                // TO PAUSE THE THREAD
        boton_iniciar_proceso1.Text = "Resume";
    }
    else
    {
        myResetEvent.Set(); // SAME BUTTON WITH LABEL CHANGED
                            // TO "RESUME" TO UNPAUSE
        boton_iniciar_proceso1.Text = "Pause";
    }
}

进行此更改后,GUI 变得响应良好,而且我确信正确的方法是使用不同的线程。但是,当再次单击将标签更改为“暂停”的按钮时,它不会暂停线程run1,它会继续......myResetEvent.WaitOne();

请问我可以请你帮忙吗?我也很困惑,不知道从哪里继续或改变什么......</p>

提前非常感谢。我真的很想在 5 天后关闭这个东西,而不是这个好主意。

4

0 回答 0