1

我在这里的第一篇文章,但这个网站已经回答了我过去的许多问题。希望我能提供足够的细节来解释我面临的问题,因为我不完全理解所有 .NET 如何处理我创建的线程!

好的,基本上,我有一个线程设置为每 1000 毫秒运行一次,它从视频编码器获取帧计数器并计算 FPS。System.Threading.Timer 现在的准确性已经足够了,尽管我意识到它并不准确(事件之间通常超过 1000 毫秒)。我还有另一个 Threading.Timer 正在运行并从网络读取数据到串行设备。问题是,如果网络设备不可用并且该计时器上的套接字超时,则 FPS 计时器将完全不同步!所以他们以前每 1015 毫秒(测量)执行一次,但是当我启动另一个 Thread.Timer 尝试建立套接字连接并且它失败时,它会导致 FPS 计数器计时器完全关闭(最多 7000 毫秒!!)。我不太清楚为什么这应该是并且真的需要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

感谢您的评论,我通过执行以下操作修复了它。

改为使用 aSystem.Timers.Timer并将自动重置设置为 false。每次其中一个计时器完成时,我都会再次启动它,这意味着每个电池设备只有一个计时器。初始解决方案的问题是网络超时导致线程存活的时间比定时器间隔长得多。因此,为了确保满足计时器间隔,更频繁地产生了一个新线程。

在运行期间,这意味着每个电池定时器大约有 5-7 个线程(其中 6 个正在超时,1 个即将开始)。更改为新计时器意味着现在应该只有一个线程。

我还在代码中添加了根据所用时间计算 FPS(使用秒表功能获得更高的准确性(感谢 USR))。谢谢您的帮助。我必须确保不要只将例外留空。

于 2012-04-09T11:40:44.493 回答