Я нахожусь в узком месте, заканчивая 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 дней, не придя с хорошей идеей.