繁体   English   中英

如何在变量在指定时间范围内获得相同值时触发事件?

[英]How to trigger an event when a variable gets the same value in a specified timeframe?

static void barreader_method()
{
   barreader.OpenPort(barport, 19200); //opens the port connected to the rfid reader
   byte TagType; //tag type
   byte[] TagSerial = new byte[4]; //tag serial in reverse order
   byte ReturnCode = 0; //return code sent from the rfid reader
   string bartagno; //tag no as a string

   while (true)
   {
      bartagno = "";
      while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode)) /*wait until a tag is present in the rf field, if present return the tag number.*/
      {
      }
      for (int i = 0; i < 4; i++)
      {
         bartagno += TagSerial[i].ToString("X2");
      }
      barprocess(bartagno); //barprocess method
      Thread.Sleep(1200); //this is to prevent multiple reads
   }
}

如果bartagno变量在一分钟内得到相同的值,我不想执行barprocess方法,而是继续无限循环。 否则将执行barprocess方法。 我怎样才能实现这一目标? 我甚至不知道从哪里开始。 我尝试了不同的日期时间,循环组合没有成功。

-------------------------------------------------- -------下面添加进度---------------------------------------- -------

可以在一分钟内读取多张卡片,因此仅与之前的卡片进行比较无疑会有所帮助。 我尝试使用arraylist而不是基于Kelly Ethridge的回答(谢谢)。 但是,如果我们每隔十秒获得一次读数,那么这将是无用的。 我们仍然需要删除超过1分钟的项目。

static void barreader_method()
{
    barreader.OpenPort(barport, 19200);
    byte TagType;
    byte[] TagSerial = new byte[4];
    byte ReturnCode = 0;
    string bartagno;
    ArrayList previoustagnos = new ArrayList();
    DateTime lastreaddt = DateTime.MinValue;

    while (true)
    {
        bartagno = "";
        while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode))
        {
        }
        for (int i = 0; i < 4; i++)
        {
            bartagno += TagSerial[i].ToString("X2");
        }
        if (DateTime.Now - lastreaddt > TimeSpan.FromMinutes(1))
        {
            previoustagnos.Clear();
            barprocess(bartagno);
            previoustagnos.Add(bartagno);
            lastreaddt = DateTime.Now;
        }
        else
        {
            previoustagnos.Sort();
            if (previoustagnos.BinarySearch(bartagno) < 0)
            {
                barprocess(bartagno);
                previoustagnos.Add(bartagno);
                lastreaddt = DateTime.Now;
            }
        }
        Thread.Sleep(1200);
    }
}

您需要跟踪上次调用barprocess的时间以及之前的bartango是什么。

static void barreader_method()
{
   barreader.OpenPort(barport, 19200); //opens the port connected to the rfid reader
   byte TagType; //tag type
   byte[] TagSerial = new byte[4]; //tag serial in reverse order
   byte ReturnCode = 0; //return code sent from the rfid reader
   string bartagno; //tag no as a string
   string previousbartango;
   var lastTimeCalled = DateTime.MinValue;

   while (true)
   {
      bartagno = "";
      while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode)) /*wait until a tag is present in the rf field, if present return the tag number.*/
      {
      }
      for (int i = 0; i < 4; i++)
      {
         bartagno += TagSerial[i].ToString("X2");
      }
      var spanSinceLastCalled = DateTime.Now - lastTimeCalled;
      if (spanSinceLastCalled > TimeSpan.FromMinutes(1) || bartango != previousbartango)
      {
          barprocess(bartagno); //barprocess method
          previousbartango = bartango;
          lastTimeCalled = DateTime.Now;
      }
      Thread.Sleep(1200); //this is to prevent multiple reads
   }
}

这是空气码,但我想你明白了。

这取决于您希望在一分钟内看到多少个标签。

想到一种丑陋的方式是创建一个新变量

List<Tuple<DateTime, String>> recentTags = new List<Tuple<DateTime, String>>()

每当你看到一个bartagno,搜索这个列表,看看它是否已经在这里。 如果是,请跳过它。 如果没有,请将其添加到列表中:

recentTags.Add(Tuple.Create(DateTime.Now, bartagno));

有时(通过主循环可能需要5到10次),您将要从此列表中删除旧记录。

recentTags.RemoveAll(e => e.Item1....

(crud - 我不记得“e.Item1过去超过1分钟”的语法)

这不像存储上次处理的值和日期时间那么简单。 如果读取在时间限制内,那么在调用barprocess()方法之前测试相同性?

... String lastBarTagNo =“”; DateTime lastTagProcessDateTime = DateTime.MinValue; ... while(true){... //读取标签并构建新的bartagno if(DateTime.Now - lastTagProcessDateTime <TimeSpan.FromMinutes(1))&& lastBarTagNo.Equals(bartagno){barprocess(); }}

(抱歉格式化 - 在智能手机上执行此操作)

static void barreader_method()
{
    barreader.OpenPort(barport, 19200);
    byte TagType;
    byte[] TagSerial = new byte[4];
    byte ReturnCode = 0;
    string bartagno;
    List<Tuple<DateTime, String>> previoustags = new List<Tuple<DateTime, String>>();
    DateTime lastreaddt = DateTime.MinValue;

    while (true)
    {
        bartagno = "";
        while (!barreader.CMD_SelectTag(out TagType, out TagSerial, out ReturnCode))
        {
        }
        for (int i = 0; i < 4; i++)
        {
            bartagno += TagSerial[i].ToString("X2");
        }
        if (DateTime.Now - lastreaddt > TimeSpan.FromMinutes(1))
        {
            previoustags.Clear();
            barprocess(bartagno);
            previoustags.Add(Tuple.Create(DateTime.Now, bartagno));
            lastreaddt = DateTime.Now;
        }
        else
        {
            if (!previoustags.Exists(a => a.Item2.Equals(bartagno)))
            {
                barprocess(bartagno);
                previoustags.Add(Tuple.Create(DateTime.Now, bartagno));
                lastreaddt = DateTime.Now;
            }
        }
        previoustags.RemoveAll(a => a.Item1.CompareTo(DateTime.Now - TimeSpan.FromMinutes(1)) < 0);
        Thread.Sleep(1200);
    }
}

非常感谢Dan和Kelly。 没有你的帮助,我将无法解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM