Windows Forms C# で GUI を完成させるのがボトルネックになっています。私はこれを行うのは100%初めてで、混ぜたりいじったりしていると思います。誰かが私を助けてくれますか?
人工視覚アプリケーション (HALCON ソフトウェアで開発され、C# にエクスポート) を埋め込んでいます。3 つの出力 (2 枚の画像と文字列) を持つ 1 つのメソッドを使用して、このアプリを 1 つのクラスで再開します。
このクラスを他のクラスとの 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
、続行します...そして、原因が発生するとGUIが一時停止/応答しなくなりますmyResetEvent.WaitOne();
助けをお願いできますか?私も混乱しており、どこを続けるべきか、何を変更すべきかわかりません…</p>
よろしくお願いします。良いアイデアが思い浮かばなかったので、5日後にこのことを閉じたいと思います。