c# - System.Threading.Timer导致其他计时器落后

标签 c# multithreading sockets timer timeout

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

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

一点代码->

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;   
}

希望不要太模棱两可!

最佳答案

虽然我不知道为什么FPS计时器不被调用7s,但我可以建议一种解决方法:通过记住Environment.TickCount值,测量自上次更新FPS值以来的TimeSpan。然后,将FPS值计算为(delta_frames/delta_t)。

关于c# - System.Threading.Timer导致其他计时器落后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066733/

相关文章:

ios - 执行许多阻塞主线程的 UIKit 操作

java - 将输出序列化到数组列表中

java - 可中断套接字读取Java

c# - 使用表单例份验证返回登录屏幕

javascript - Web api 的 POST 参数设置为 null

c++ - 使用 alignas 防止错误共享被破坏

python - 从另一个线程调度异步协程,无需大量回调和同步等待

java - doInBackground 卡住了

c# - 关系型 SQL Server 数据库

使用对象引用的 C# 垃圾回收