我在这里的第一篇文章,但是该站点已经回答了我过去遇到的许多问题。希望我能提供足够的细节来解释我所面临的问题,因为我不完全了解所有.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/