0

我正在尝试以 100 毫秒发送/发布,消息看起来像这样 xxxxxxxxxx 所以每 100 毫秒左右就会调用一次订阅。我的问题是,我认为它不够快,(即,如果当前订阅尚未完成并且正在调用另一个订阅/正在发布消息)

我在想,我如何才能继续填充列表,同时使用 Oxyplot 绘制图表。我可以为此使用线程吗?

var x = 0;
channel.Subscribe(message =>
            {
                this.RunOnUiThread(() =>
                {

                    var sample =  message.Data;
                    byte[] data = (byte[])sample;
                    var data1 = System.Text.Encoding.ASCII.GetString(data);
                    var splitData = data1.Split('-');
                    foreach(string s in splitData) //Contains 10
                    {
                        double y = double.Parse(s);
                        y /= 100;
                        series1.Points.Add(new DataPoint(x, y));
                        MyModel.InvalidatePlot(true);
                        x++;
                    }
                    if (x >= xaxis.Maximum)
                    {
                        xaxis.Pan(xaxis.Transform(-1 + xaxis.Offset));
                    }


                });
            });
4

1 回答 1

0

保证最短执行时间进入实时编程。有了智能手机操作系统上的应用程序,你就离我想象的那样远了。唯一更“偏离”的是任何解释语言(PHP、Python)。

您唯一能做的就是定义迭代之间的最短时间。我曾经写过一些示例代码,用于在替代线程中执行此操作。一个基本的速率限制代码:

integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);

while(true){
  if(DateTime.Now >= dueTime){
    //insert code here

    //Update next dueTime
    dueTime = DateTime.Now.AddMillisconds(interval);
  }
  else{
    //Just yield to not tax out the CPU
    Thread.Sleep(1);
  }
}

请注意, DateTime.Now 仅每 18 毫秒返回一次新的东西,所以任何小于 20 的东西都太少了。

如果您认为自己负担不起最短时间,则可能需要阅读Speed Rant

于 2019-07-31T16:21:13.437 回答