Jump to content

For loop

From LabVIEW Wiki
Revision as of 05:08, 18 March 2007 by MichaelAivaliotis (talk | contribs) (New page: == What does 0ms wait function do in a while loop == If you have multiple loops in your application that don't need to run as fast as possible, then placing a 1ms delay will limit your lo...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

What does 0ms wait function do in a while loop

If you have multiple loops in your application that don't need to run as fast as possible, then placing a 1ms delay will limit your loops to at most 1000 iterations per second. Without a delay, the loop rate can be in the millions of iterations per second range depending on what is inside it. So that means that your CPU has about 1/1000th as much work to do and can go off and tend to other tasks. If your loop was already taking several ms, then the 1ms delay is likely in parallel and it won't affect the loop speed noticeably. So placing the delay in the loop can drop your CPU usage noticably and allow time for the OS to do other work like send messages that your application may be waiting for, etc.

But what does a wait of 0 ms do? Let's consider the LV execution system to be a xerox copying machine. Everyone that has something to copy heads for the copying machine and lines up. If you have never had the pleasure of waiting at a copy machine, then consider any other time consuming task where people wait in line. Everytime a LV diagram executes a wait function, it is like releasing the copier and staying out of the line for some time delay. After the delay has passed, you will get back in line to make your next copy. A wait of 0 ms is like immediately going to the end of the line to let a smaller copy-task take place. If nobody is in line behind you, you immediately start your next copy task. If someone is in line, it lets them take a turn.

This 0 ms wait is a pretty cool little trick to make LabVIEW loop parallelism less chunky. It naturally adds some overhead because the loops have some setup time, but when the loops are doing significant work it is tiny. Use it whenever you think you need to, but beware that if some loops don't have any delay, they are still going to

hog the CPU, and the wait of 0 ms may turn into much larger waits because the loops with no waits play by different rules.

Is the while loop really a while loop?

No. Strictly speaking the while loop is a "do while" (in C) or repeat until (in PASCAL) programming structure. In other words the loop always executes at least once, and the Boolean test for continuation is done at the end of the loop execution. With a true while loop in a text based program the test is done prior to executing any of the commands contained within the loop.

To create a "real" while loop wire the output of your terminating condition to a case structure surrounding the rest of the code within the loop.

This is of course true, but then there is no real difference between a while loop as you describe it and a for loop in C either. Of course the syntax changes but the functionality is really equivalent. And instead of putting the case structure inside the while loop you could just as easily put the while loop in the case structure and get the same behaviour and IMO it looks more clear what is happening.

Also true, but then you loose having a shift register from the loop hold variable(s) that are part of the exit test, unless you then wrap the whole thing in another loop.

[QUOTE] and the Boolean test for continuation is done at the end of the loop execution.[/quote]

This is a little misleading, particularly for new LabVIEW programmers. The boolean test for continuation is done as soon as possible... it only waits until the end of loop execution if there is a data dependency. With no dependacy, the loop will decide whether to execute again before/in parallel with any other code in the loop.

I have seen plenty of people getting one extra iteration than they expected because of this.