- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个简单的 UDP 到图表应用程序(适用于 Windows 窗体),它将从以太网获取原始数据,并以特定方式将其放入图表中。到目前为止,这是我所拥有的:包含两个图表的表格,一个用于接收 UDP 数据包的线程:
public void serverThread()
{
UdpClient udpClient = new UdpClient(Convert.ToInt16(tbEthPort.Text));
while (_serverWork)
{
try
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, Convert.ToInt16(tbEthPort.Text));
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
if (receiveBytes.Length > 0)
for (i = 0; i < receiveBytes.Length; i++)
{
bigDataIn[i] = receiveBytes[i];
}
并绘制第二张图表(以特定方式显示所有数据包内容):
if (graphicOn)
{
for (i = 0; i < 32; i++)
{
graphicData[i + (graphicStep * 32)] = bigDataIn[i * 32 + graphicChan];
}
graphicStep++;
if (graphicStep == 32) graphicStep = 0;
try
{
Invoke(new Action(() => { chartGraphic.Series["DataGraphic"].Points.DataBindXY(graphicEnum, graphicData);
}));
}
catch
{
}
}
和一个带计时器的主线程来绘制第一个图表。
private void tmrHisto_Tick(object sender, EventArgs e)
{
int[] slice = new int[32];
for (int i = 0; i < 32; i++)
slice[i] = bigDataIn[i + 32 * histogramArrayStep];
histogramArrayStep++;
if (histogramArrayStep == 32) histogramArrayStep = 0;
chartHistogram.Series["DataHistogram"].Points.Clear();
for (int i = 0; i < HISTO_XMAX; i++)
{
chartHistogram.Series["DataHistogram"].Points.AddXY(i, slice[i]);
}
}
在我的电脑和其他几台电脑上一切正常,但当我在旧电脑上启动我的应用程序时,我的应用程序开始丢失数据包。当我开始 Invoke
chartGraphic
时,数据包丢失就开始了。我可以在 WireShark 中看到所有数据包(大约每秒 20 个)而没有任何损失。当计时器间隔设置为 50 毫秒而不是 150 毫秒时,我遇到了同样的问题,但我不能再增加间隔了。
所以这就是我的问题 - 我能否提高图形绘制的速度,并阻止低端 PC 上的数据包丢失。或者如何在调试期间模拟低端 PC?
最佳答案
Invoke
处于阻塞状态,因此您的接收线程将等待绘图(DataBindXY) 完成。尝试将其移到接收线程之外。
循环缓冲区看起来很快,但看起来它只保存引用。这并没有太大改善。此外,您将从 udpClient 获取新缓冲区:Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
循环缓冲区仅在“旧”内存被重用时才有用。
尝试并发队列将数据从接收线程传递到图形用户界面线程/计时器。确保重新绑定(bind)/绘制在并发队列的锁之外。现在您获得了接收数据报的性能。
更新:
一些伪代码:
返回:
private List<byte[]> datagrams = new List<byte[]>();
public void serverThread()
{
UdpClient udpClient = new UdpClient(Convert.ToInt16(tbEthPort.Text));
while (_serverWork)
{
try
{
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, Convert.ToInt16(tbEthPort.Text));
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
// add to the queue
lock (datagrams)
datagrams.Add(receiveBytes);
}
}
}
界面:
private Timer timer = new Timer();
public void timer_Tick(object sender, EventArgs e)
{
byte[][] data;
// lock the queue as short as possible. (create a copy with ToArray())
// this way the receive thread can run again..
// this is also know as bulk processing..
lock (datagrams)
{
data = datagrams.ToArray();
datagrams.Clear();
}
// if no packets received, don't update anything
if(data.Length == 0)
return;
// process the received data (multiple datagrams)
for(byte[] item in data)
{
...
}
// Update chart
}
您可能会检查队列是否变得太大。发生这种情况时,您的队列处理速度太慢。您可以限制项目数。
关于C#:图表:从收到的 UDP 数据包中放入数据的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532998/
我似乎对 git 存储库有权限问题。 当我 pull 入一个不是我的 Linux 用户创建的目录时,我出现了这个错误。 fatal: Unable to create '/home/---/.git/
在 Git 中,您可以将给定目录克隆到给定目录: git clone ssh://gitolite@dev.bipper.com:3687/com/bipper/kids/portal 当我运行我们
目前,如果您在分支 V2 中并执行“git pull origin V3”,它会将 V3 merge 到 V2,甚至不会发出警告或提示。这个选项可以以某种方式被阻止吗?我在这里阅读了所有类似的问题,人
我刚开始使用 Oracle 的 Coherence 缓存,我注意到这一点:如果我在缓存中放入一个 ConcurrentHashMap 对象,当我检索它时,我可以看到它被转换为一个普通的 HashMap
看起来我缺少对 git pull 和 git commit 的基本理解,假设我在分支上工作,而它在我更新时被其他开发人员更新了在本地做我的工作。我应该在发出 git pull 之前提交更改,还是应该执
好的。所以我以为我已经舔过了……但现在…… 我有一个项目,其中包含一个来自 GitHub 的小型库作为子模块。在该 super 项目的原始版本中,子模块按预期工作。 但是,我只是克隆了 super 项
使用 Visual Studio Code 中的内置 Git,我看不到将指定的远程分支 pull 入当前分支的方法。我可以这样做吗? 示例:我正在分支 myBranch 上工作,更改已 merge 到
当我尝试提交或 pull 此错误时 Bus error (core dumped) 发生了! 当我用 gdb 调试它时,(gdb git,run commit -a,where) 结果是: mucul
我对默认 Rails Rake 任务的预期用途有点困惑,想咨询一下我是否应该使用 db:reset或编写自定义 Rake 任务。没什么聪明的,只是日常管理,而且我很可能会错过一个明显的文档,因为我是
所以我做了: git reset --hard #commithash # make a bunch of changes, fixes and so on. git add -A git commi
我已使用以下命令成功部署到 firebase 托管应用: firebase init firebase deploy 在这个阶段,我正在执行 git pull 以将 repo 下 pull 到暂存服务
当尝试在 Eclipse 的 git 存储库中 pull (团队|从上下文菜单中 pull )时,出现 Could not get advertised Ref for branch refs/hea
我是一名优秀的程序员,十分优秀!