Ошибка при запуске, приостановке и продолжении встроенного приложения HALCON в формах windows с использованием независимого потока - PullRequest
0 голосов
/ 23 марта 2020

Я нахожусь в узком месте, заканчивая GUI в Windows формах C#. Я на 100% новичок в этом и думаю, что я смешиваюсь и бездельничаю. Кто-нибудь может мне помочь, пожалуйста?

Я встраиваю приложение для искусственного зрения (разработанное в программном обеспечении HALCON и экспортированное в C#). Я возобновляю это приложение в одном классе с одним методом, имеющим три выхода (пару изображений и строку).

Я поместил этот класс в какое-то время l oop с другими классами для итерации и взаимодействия с выходными данными приложения видения до состояния statusFile, равного 1, для выхода из l oop.

Во-первых, я использовал только среднюю нить, и мой GUI перестал отвечать на запросы, когда внутрь oop проникало в зрение.

Фрагмент кнопки «Пуск»:

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, она продолжается… и теперь GUI приостанавливается / не отвечает, когда причина myResetEvent.WaitOne();

Могу ли я попросить вас о помощи, пожалуйста? Я также запутался и не знаю, где продолжить или что изменить…

Заранее большое спасибо. Я действительно хочу закрыть эту вещь через 5 дней, не придя с хорошей идеей.

...