내 첫 번째 게시물이 있지만이 사이트는 과거에 많은 질문에 대답했습니다. 다행히도 필자는 모든 .NET이 내가 만든 스레드를 어떻게 처리하는지 완전히 이해하지 못하기 때문에 직면하게되는 문제를 설명하기에 충분한 세부 정보를 제공 할 수 있기를 바랍니다.System.Threading.Timer가 다른 타이머를 늦추는 원인이됩니다.
그래, 기본적으로 스레드는 비디오 인코더에서 프레임 카운터를 가져 와서 FPS를 계산하는 매 1000ms마다 실행되도록 설정했습니다. 정확성은 System.Threading.Timer로는 충분하지만 현재로서는 정확하지 않습니다 (종종 사건 간 1000ms 이상). 또 다른 Threading.Timer가 실행 중이며 네트워크에서 직렬 장치로 읽는 중입니다. 문제는 네트워크 장치를 사용할 수 없게되고 해당 타이머에서 소켓 시간 초과가 발생하면 FPS 타이머가 완전히 동기화되지 않습니다. 그래서 그들은 이전에 1015ms (측정)마다 실행하고 있었지만,이 다른 Thread.Timer를 시작하여 소켓 연결을 시도하면 FPS 카운터 타이머가 완전히 꺼집니다 (최대 7000ms !!). 왜 이것이 있어야하고 FPS 카운터가 무엇이든 상관없이 1 초에 1 번 실행해야하는 이유는 확실하지 않습니다. 코드의
비트 ->
public Socket mSocket { get; set; }
public bool Connect(IPAddress ip_address, UInt16 port)
{
try
{
mSocket.Connect(ip_address, port);
}
catch(Exception ex)
{
}
return mSocket.Connected;
}
->
FPS 카운터
private void getFPS(Object stateInfo)//Run once per second
{
int frames = AxisMediaControl.getFrames; //Axis Encoder media control
int fps = frames - prevValue;
prevValue = frames;
setFPSBar(fps, fps_color); //Delegate to update progress bar for FPS
}
배터리 잔량 타이머
while (isRunning)
{
if (!comm.Connected) //comm is standard socket client
comm.Connect(this.ip_address, this.port); //Timeout here causes other timer threads to go out of sync
if (comm.Connected)
{
decimal reading = comm.getBatt_Level();
//Calculate Readings and update GUI
Console.Out.WriteLine("Reading = " + (int)prog);
break;//Debug
}
이 현재 소켓에 연결하는 데 사용되는 코드입니다
희망 너무 모호하지 않은 완전히!
예외를 숨기는 것이 좋은 이유는 무엇입니까? –
소프트웨어는 많은 시간 제한이있는 환경에서 사용되며 매 5 초마다 메시지를 표시하는 것이 유용 할 것이라고 생각하지 않습니다. 나는 디버깅 할 때 예외를 잡았지만 네트워크가 무선이기 때문에 때때로 연결이 실패하고 작동 중에 드롭 아웃이 발생할 것으로 예상한다. 너는 무엇을 제안 하겠는가? – jackocurly0074
나는'TimeoutException' 또는 당신이 염려하는 특정 예외를 포착하고 다른 것들이 전파되도록 허용 할 것을 제안한다. 그렇게하면 다른 예외가 무엇인지 알게됩니다. –