1

ここに初めて投稿しましたが、このサイトは私が過去に抱えていた多くの質問に答えてくれました。すべての .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;   
}

あいまいすぎないことを願っています!

4

2 に答える 2

1

FPSタイマーが7秒間呼び出されない理由はわかりませんが、回避策を提案できます。Environment.TickCount値を記憶して、FPS値が最後に更新されてからのTimeSpanを測定します。次に、FPS値を(delta_frames / delta_t)として計算します。

于 2012-04-08T21:44:59.237 に答える
1

コメントありがとうございます、次のようにして修正しました。

代わりにa を使用し、System.Timers.Timerauto-reset を false に設定しました。タイマーの 1 つが完了するたびに、もう一度開始します。これは、バッテリー デバイスごとに 1 つのタイマーしかないことを意味します。最初の解決策の問題は、ネットワーク タイムアウトが原因で、スレッドがタイマー間隔よりもはるかに長く存続していたことです。したがって、タイマー間隔が確実に満たされるようにするために、新しいスレッドがより頻繁に生成されました。

ランタイム中、これは各バッテリ タイマーに対して約 5 ~ 7 のスレッドが存在することを意味します (そのうち 6 つがタイムアウトし、1 つが開始しようとしています)。新しいタイマーに変更するということは、本来あるべきスレッドが 1 つしかないことを意味します。

かかった時間に基づいて FPS を計算するコードも追加しました (精度を上げるためにストップウォッチ機能を使用します (USR に感謝))。助けてくれてありがとう。例外も空白のままにしないようにする必要があります。

于 2012-04-09T11:40:44.493 に答える