ここに初めて投稿しましたが、このサイトは私が過去に抱えていた多くの質問に答えてくれました。すべての .NET が作成したスレッドをどのように処理しているかを完全には理解していないため、直面している問題を説明するのに十分な詳細を提供できることを願っています!
基本的に、ビデオ エンコーダーからフレーム カウンターを取得して FPS を計算するスレッドを 1000 ミリ秒ごとに実行するように設定しました。System.Threading.Timer の精度は今のところ十分ですが、正確ではないことはわかっています (多くの場合、イベント間で 1000 ミリ秒を超えます)。また、別の Threading.Timer が実行されており、ネットワークからシリアル デバイスへの読み取りを行っています。問題は、ネットワーク デバイスが使用できなくなり、そのタイマーのソケットがタイムアウトになると、FPS タイマーが完全に同期しなくなることです。そのため、以前は 1015ms (測定値) ごとに実行していましたが、この別の Thread.Timer を開始してソケット接続を確立しようとすると失敗し、FPS カウンター タイマーが完全にオフになります (最大 7000ms !!)。なぜこれが必要なのかはよくわかりませんが、何があっても FPS カウンターを 1 秒に 1 回実行する必要があります。
コードのビット ->
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
}
これは、現在ソケットに接続するために使用されているコードです ->
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;
}
あいまいすぎないことを願っています!