首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只运行一次while循环,即使条件保持为真的时间超过了完成循环所需的时间

如何只运行一次while循环,即使条件保持为真的时间超过了完成循环所需的时间
EN

Stack Overflow用户
提问于 2017-12-15 05:38:00
回答 3查看 1.7K关注 0票数 0

我有一个应用程序,我正在检查从PLC读取的信号是正确的还是错误的,它是正确的-它做了一组计算,如果是假的,它等待信号。我用了一个while循环来做这个。但问题是,真正的状态保持在1000 is内,循环在不到100 is的时间内完成,所以它再次恢复,并且由于状态为true,它再次证明它。因此,对于我从PLC接收到的一个信号,循环运行约9-10次.我尝试过添加thread.sleep,但它仍然不止一次地处理它。当状态为true时,我希望循环运行一次,然后等待它再次变为真。

以下是代码:

代码语言:javascript
复制
 bool isRunning = true;

    private void WorkThreadFunction()
    {
        while (isRunning)
        {

             if (ethernetIPforSLCMicroCom1.Read("B3:254/1") == "True")
            {

                stopWatch = Stopwatch.StartNew();

                int isTriggered;

                Int32.TryParse(trigger, out isTriggered);

                timer1.Start();


                Thread.Sleep(10);
                serialcheck();

                System.GC.Collect();

        }

    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-15 05:53:00

我处理一个从GPIO引脚读取信号的程序,您的问题与我的问题非常相似,也就是防止单个on信号被多次处理。我的解决方案是,在我去检查信号是否再次打开之前,先确保信号是关闭的。

代码语言:javascript
复制
while (isRunning)
{
    var signal = ethernetIPforSLCMicroCom1.Read("B3:254/1");
    if (signal == "True")
    {
        //do your stuff
    }

    while (signal == "True")
        signal = ethernetIPforSLCMicroCom1.Read("B3:254/1");
}

内部循环将等待信号转到"True"以外的其他东西,然后再继续任何其他执行。

票数 0
EN

Stack Overflow用户

发布于 2017-12-15 05:47:09

如果我正确地阅读了它,您只需要将一个break;放在while循环中满足条件的位置。

我在这里举了一个例子:https://dotnetfiddle.net/FsGryD

我还要补充一点,您可能会考虑使用SpinWait.SpinUntil(<boolean_condition>)是否是一个更好的选择。(https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx.

我在前面的多线程/ IO等待函数中使用了这种方法来等待设备发出的信号。

票数 0
EN

Stack Overflow用户

发布于 2017-12-15 05:50:30

为了等待它再次成为真,您需要跟踪它是否是假的。

代码语言:javascript
复制
bool isRunning = true;
bool signalHasBeenFalse = true;

private void WorkThreadFunction()
{
    while (isRunning)
    {

         if (ethernetIPforSLCMicroCom1.Read("B3:254/1") == "True" && hasBeenFalse )
        {
            signalHasBeenFalse = false;

            stopWatch = Stopwatch.StartNew();

            int isTriggered;

            Int32.TryParse(trigger, out isTriggered);

            timer1.Start();


            Thread.Sleep(10);
            serialcheck();

            System.GC.Collect();

        }

        if ( ethernetIPforSLCMicroCom1.Read("B3:254/1") != "True" ) 
        {
            signalHasBeenFalse = true;
        }

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47826400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档