我在完成 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 天后关闭这个东西,而不是这个好主意。