Files
ENIG/Cs_HMI/StateMachine/EventArgs.cs
backuppc 34ad1db0e3 Fix: 상태머신 루프 블로킹 문제 수정 - SPS 이벤트 핸들러 비동기 처리 및 타임아웃 보호 추가
- sm_SPS 이벤트 핸들러에서 장치 연결 및 상태 전송을 비동기로 처리

- DeviceConnectionWorker 스레드로 장치 연결 분리

- SPS(1초), Running(2초) 타임아웃 보호 추가

- 상태머신 모니터링 디버그 창 추가 (fStateMachineDebug)

- F11/F12 단축키로 스레드 덤프 및 디버그 브레이크 지원

- RaiseMessage 이벤트 비동기 처리로 로그 블로킹 방지
2025-12-04 14:43:57 +09:00

76 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Project.StateMachine
{
public partial class StateMachine
{
public class StateMachineMessageEventArgs : EventArgs
{
public string Header { get; set; }
public string Message { get; set; }
public StateMachineMessageEventArgs(string header_, string message_)
{
this.Message = message_;
this.Header = header_;
}
}
public event EventHandler<StateMachineMessageEventArgs> Message;
void RaiseMessage(string header, string msg)
{
if (Message != null)
{
try
{
// 비동기로 이벤트 발생 (블로킹 방지)
var handler = Message;
if (handler != null)
{
var args = new StateMachineMessageEventArgs(header, msg);
System.Threading.ThreadPool.QueueUserWorkItem(_ =>
{
try
{
handler(this, args);
}
catch { /* 이벤트 핸들러 예외 무시 */ }
});
}
}
catch { /* 예외 무시 */ }
}
}
public class StepChangeEventArgs : EventArgs
{
public eSMStep Old { get; set; }
public eSMStep New { get; set; }
public StepChangeEventArgs(eSMStep old_,eSMStep new_)
{
this.Old = old_;
this.New = new_;
}
}
public class RunningEventArgs : EventArgs {
public Boolean isFirst { get; set; }
public eSMStep Step { get; set; }
public TimeSpan StepTime { get; set; }
public object Data { get; set; }
public RunningEventArgs( eSMStep step_, Boolean isfirst_,TimeSpan steptime_,object data = null)
{
this.isFirst = isfirst_;
this.Step = step_;
StepTime = steptime_;
this.Data = data;
}
}
public event EventHandler<StepChangeEventArgs> StepChanged;
public event EventHandler SPS;
public event EventHandler<RunningEventArgs> Running;
}
}