Stopping for loop
Hello
I’m trying to stop a for loop of a subVI while it is still running. In the example you can see my problem. When I run the main VI the loop begins. When I press the stop button (in the main VI) the loop first finishes and after that the VI stops. Is it possible to program that when I push the button the VI immediately stops?
Thank you in advance
Attachments:
Try.llb 35 KB
becktho a écrit:
Did you really stop a for loop? If so - could you attach the library as LV7.0? I'm wondering how you could have accomplished that.
Sorry to disapoint you Becktho, but the loop was a while loop. And anyway, I would have replaced it !
I agree with you, the possibility to leave a for loop would be of interest, although a while loop (actually a repeat-until loop) is easy to use. But the diagram could be simplified. Imagine : right-click the loop border, and select "create conditionnal exit", just bellow "add shift register"
On another hand, having only two types (actually 3 with the timed loop) of loop structures is also quite simple. Have you noticed how beginners are confused by the number of different wire types ?
Chilly Charly (aka CC)
E-List Master - Kudos glutton - Press the yellow button on the left...
Similar Messages
-
i have a for loop inside of while loop.when i press stop for while loop, i also would like to stop for loop.how can i solve this problem?thanks
Hi fais,
Following through with what JB suggested. The steps involved in replacing the inner for loop with a while loop are outlined below.
You can replace the inner for loop with a while by doing the following.
1) Right-click of the for loop and select "Repalce" then navigate to the "while loop".
2) Make sure the tunnels you where indexing on with the for loop are still indexing.
3) Drop an "array size" node on your diagram. Wire the array that determines the number of iterations your for loop executes into this "array size".
4) Wire the output of the array size into the new while loop.
5) Set the condition terminal to "stop if true".
6)Drop an "OR" gate inside the while loop and wire its output to the while loops condition terminal.
7) C
reate a local of the boolean "stop" button, and wire it into one of the inputs of your OR gate. This will allow you to stop the inner loop.
8) Drop a "less than" node inside the inner while loop.
9) Wire your iteration count into the bottom input of the "less than".
10) Wire the count (see step 4 above) into the top input of the less than. This will stop the inner loop when ever the inner loop has processed the last element of your array.
Provided I have not mixed up my tops and bottoms this should accomplish the replacement.
I will let others explain how to takle this task using the "case solution".
Ben
Ben Rayner
I am currently active on.. MainStream Preppers
Rayner's Ridge is under construction -
Boolean to start/stop for loop
I am trying to connect a boolean so that it will start a for loop. I don't want the data in the for loop to be excuted until the user tells it to start. The loop will run the specified number of times, which is what the user inputs, so the boolean only needs to start the for loop. Currently the way I have the boolean connected it is not actually doing anything to the for loop.
Are you using a different login name and did you also post the same question here?
-
For loop stop in sub vi from main vi?
Hi! I want to control from my main vi a sub vi consisting of a stepped sine function generator. This sub vi has a for loop. The problem is that I want to have the option of terminating the loop in the sub vi from the main vi. I tryed using global variables or an event stucture. The problem is that, in both cases, the "stop" variable in my main vi is only updated after the loop terminates in the sub vi. Can anyone please help me? Thank you very much.
Best regards,
Diogo Montalvão (Lisbon, Portugal)hong2011 wrote:
I found this thread very helpful. May I ask one thing - what is the purpose of the Occurrence?? If I try it without implementing the Occurrence (neither in main VI or subVI), labview crashes when the subVI completes its task or is stopped from the mainVI.
A lot of things changed in the last 6 years, so this thread is a bit stale and there are a few other ways to do it. (For example we can have a FOR loop with a conditional terminal).
You don't provide enough information to answer your question why it crashes. It would be more interesting to know what you are "using" and not what you are "not using". This is not something we can guess by elimination.
LabVIEW should never crash, so please show us the code that crashes so NI can fix it. What LabVIEW version are you using?
LabVIEW Champion . Do more with less code and in less time . -
How to terminate or exit a for loop when the user clicks on stop button
Actually my problem is to stop a loop when i click on stop button.
example:i have two buttons 'start' and 'stop'
in start buttom i wrote a for loop as
dim i as integer
For i=1 To 100000
print i
Next
when i click on start buuton it prints 'i' value up tp 100000.
my question is when i click on 'Stop' button the for loop has to terminate or Exit from the loop and should stops the execution.
Is it possible to termianate or Exit the 'for loop'
PS.Shakeer Hussain
HyderabadI am unable to stop the loop and application not at all allowing to Press the Stop button.
It seems like Hung, any advise ?
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
btnStop.Enabled = True
btnSelectFile.Enabled = False
btnStart.Enabled = False
btnStop.Focus()
Dim strFileName As String = txtFileName.Text.ToString
Dim strLineText As String
If System.IO.File.Exists(strFileName) = True Then
Dim objReader As New System.IO.StreamReader(strFileName)
While objReader.Peek() <> -1 And stopclick = False
strLineText = objReader.ReadLine()
MsgBox(strLineText, MsgBoxStyle.Information)
Application.DoEvents()
Thread.Sleep(My.Settings("strDelay") * 1000)
'System.Diagnostics.Process.Start(My.Settings("strFireFoxLocation"), strLineText)
End While
End If
End Sub
Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
stopclick = True
btnSelectFile.Enabled = True
btnStart.Enabled = True
btnStop.Enabled = False
End Sub
Raman Katwal
Please remember to mark the replies as answers if they help and unmark them if they provide no help -
How to stop and start a for loop
I've got code and a for loop running in a while loop. What I need to do is simply pause the operation of the for loop until an requirement is met, and but maintain its iteration position throughout each pause interval (not necessarily timed, just paused until the next requirement is met). I've tried wiring a boolean to the "continue if true" terminal of the for loop, but the iteration count restarts to 0 when the loop is started again. Is there a way to stop the for loop, and continue at the particular iteration it is at?
Solved!
Go to Solution.Breakpoints, whether normal or conditional, are just meant for debugging of your code. I had the sense from your question that the pausing you want to do is a part of normal operation of your code. I would NOT recommend using a breakpoint for that situation. It would bring up the block diagram showing the breakpoint when it occurs. A user besides the programmer would not know what to do in that case.
Yes, both the inner and outer loops would have shift registers.
Putting a case structure with a small while loop inside the "Pausing Case" is doable. It just depends on what you are doing or waiting for while the program operation is "paused". -
Hello,
Do you know how I can stop a for loop ? because when I click on the stop switch on my front panel, the VI don't stop and continue to run the loop.
Peter.
Labview 2010
Solved!
Go to Solution.Peter,
It sounds like you need a while loop, not a for loop. A button or switch does not traditionally control iterations of execution for a for loop.
Please post your code so we may help better.
-Chazzmd -
How to stop while loop for particular time
public void test()
new Thread(new Runnable()
public void run()
//Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
System.out.println("test");
//System.out.println("test ..."+i);
try
Thread.sleep(3000);
catch (InterruptedException e)
}).start();
public void startTest()
while(i < marquee_Str1.length)
marLbl1.setValue(marquee_Str1); //set value to textbox for perticular id
marLbl2.setValue(marquee_Str2[i]);
marLbl3.setValue(marquee_Str3[i]);
test(); // call thread function
i++;
in this code while loop don't stop
plz help me to stop while loop for certain period by using thread or other techniqueYes.. the original problem would be your test() method put the sleep in an entirely separate thread of execution. So the thread is created then the method just keeps waiting. The while loop should directly call Thread.sleep... which you have apparently figured out!
-
How to pause and stop two "for loops" in an event
Hi
The main menu runs first and then goes to reading menu. After "Start Reading" button is pressed, the reading process will take readings.
1) During reading process, if the "Pause Reading" button is pressed, I want that the two "for loops" are stopped and the two "for loop" counters do not reset. After the "Start Reading" button is pressed, the two "for loops" will continue to run.
2) During reading process, if the "Stop Reading" button is pressed, I want that the two "for loops" are stopped and the two "for loop" counters are reset. After the "Start Reading" button is pressed, the two "for loops" will run again.
The attached two VIs are simplified my real application. Any help will be appreciated.
Thanks
Steve
Attachments:
Main Menu Test.vi 9 KB
Reading Menu Test.vi 23 KBYou can't have those loops inside of the event structure. Currently, when you press the start button, the reading has to finish before the event case finishes. This will prevent the stop can cancel buttons from being processed by the event structure.
You need another loop that can recieve commands from the event loop. Look up the Queued Message Handler. That should get you a good start on the command process.
There are only two ways to tell somebody thanks: Kudos and Marked Solutions
Unofficial Forum Rules and Guidelines -
How to make a button to stop and run a for loop?
How to make a button to stop and run a for loop? and if it is stopped it shall start from where i t stopped.
Your VI has some very fundamental flaws.
The start/stop button is outside the FOR loop, thus it will NOT get read during execution of the FOR loop, but only before the FOR loop starts. Think dataflow!
Thus the terminal of the start/stop button belongs inside the FOR loop.
Your FOR loop iterates 20x, which probably takes about a nanosecond. You will NOT be fast enough to reliably press the start/stop button during a specific iteration of the FOR loop.
Your code does not "stop and run" a FOR loop (sic). The loop always spins, but executes an empty case when "Stopped". I guess that's what you actually want?
Once you solve (2), the x indicator will contain a random value whenever you "stop".
As soon as the 20 iterations complete, the outer while loop spin an things start over, another nanosecond later.
Place e.g. a 500ms wait inside the FOR loop to solve this.
Don't place terminals of indicators on top of formula nodes.
Your formula does not produce any output, so really has no purpose.
Use a real "stop" button to terminate the while loop (mechanical action: latch when released). Right now you are using a plain switch, which does not reset to false before the next run. This means that you need to manually reset it before running the program again.
It is oftern useful to operate the VI in execution highlighting mode. You will immediately see that your button does not get read during execution of the FOR loop. Try it!
LabVIEW Champion . Do more with less code and in less time . -
Stopping output tasks properly before exiting a For-loop
Hi,
I've been having some trouble exiting a For-loop conditionally. The problem is that when the loop is stopped conditionally (a button is pressed) the DAQ (NI USB 6353) outputs get stuck to whatever value they were in. I tried stopping the DAQ Assistant output task (1 sample on demand) before exiting the loop but that didn't solve the problem. Should this perhaps be done one iteration before exiting the loop or can it be done in the same iteration round?
What would be the "right" way to exit a for loop with output tasks so that the output signals would be 0V after exiting? I know that I could "force" feed the DAQ Assistant with 0V control before exiting but in this case that would be quite difficult...
Any ideas? Help is appriciated.Yes, I get it... However at this point I don't think that's an option.
Would this kind of solution work? ( I am not able to test all possible solutions in the real system which is why I would like to get a confirmation first)
The idea is to connect the output of the "Or" port to the "Stop" -ports of the DAQ Assistants in the loop.
Edit. Will the output automatically go to 0V if I just stop the task? I am not really sure about this.
Thank you.
Attachments:
exit-loop.jpg 8 KB -
For loop doesn't stop at any point
public function getLabel(jail):String
var frameLabel:String = mc.currentLabel;
for(var i=0; i<jail.currentLabels.length; i++)
if(jail.currentLabel == jail.currentLabels[i].name)
trace(jail.currentLabels[i].name);
if(mc.currentLabels[i] != undefined)
frameLabel = mc.currentLabels[i+1].name;
else
frameLabel = mc.currentLabel;
return frameLabel;if you want to stop the loop if you get a match, use:
public function getLabel(jail):String
var frameLabel:String = mc.currentLabel;
for(var i=0; i<jail.currentLabels.length; i++)
if(jail.currentLabel == jail.currentLabels[i].name)
trace(jail.currentLabels[i].name);
if(mc.currentLabels[i] != undefined)
frameLabel = mc.currentLabels[i+1].name;
else
frameLabel = mc.currentLabel;
return frameLabel;
return frameLabel; -
Stopping and Continuing a For Loop
I have a problem on looping. This is a game of Whack the Mole. First, there is a for loop that is in charge of generating different hole positions for my moles. I want it so that the loop will (1) Generate a number (2) Stop the generating (3) Based on the number that was just generated, run a function for it. Once done running the function, then (4)Start the second round of generating another number......and it goes on for 9 rounds. I have my code here.
var molePosX:Array = [166.90, 494.8, 810.7];
var molePosY:Array = [282.55, 512.45, 730.35];
var moleInUse:Boolean = false;
if (moleInUse == false){
for(var i:uint = 1; i<10; i++){
var randomHole:Number = Math.floor(Math.random()*10)+1; //Generate 10 number
trace(randomHole);
switch (randomHole){
case 1: trace("1");
moleRun(molePosX[0],molePosY[0]);
break;
case 2: trace("2");
moleRun(molePosX[1],molePosY[0]);
break;
case 3: trace("3");
moleRun(molePosX[2],molePosY[0]);
break;
case 4: trace("4");
moleRun(molePosX[0],molePosY[1]);
break;
case 5: trace("5");
moleRun(molePosX[1],molePosY[1]);
break;
case 6: trace("6");
moleRun(molePosX[2],molePosY[1]);
break;
case 7: trace("7");
moleRun(molePosX[0],molePosY[2]);
break;
case 8: trace("8");
moleRun(molePosX[1],molePosY[2]);
break;
case 9: trace("9");
moleRun(molePosX[2],molePosY[2]);
break;
case 10: trace("10");
break;
function moleRun(xPos:Number,yPos:Number){
moleInUse = true;
var mole2:Mole = new Mole();
mole2.x = xPos;
mole2.y = yPos;
addChild(mole2);
moleInUse = false;
Thank you very much!i'm not sure you want to do that without staggering your mole creation but if you do, you can use:
var molePosX:Array = [166.90, 494.8, 810.7];
var molePosY:Array = [282.55, 512.45, 730.35];
createMoleF(9);
function createMoleF(n:int):void{
for(var i:uint = 0; i<n; i++){
moleRun(Math.floor(Math.random()*molePosX.length),Math.floor(Math.random()*molePosY));
function moleRun(xPos:Number,yPos:Number){
var mole2:Mole = new Mole();
mole2.x = xPos;
mole2.y = yPos;
addChild(mole2);
Thank you very much! -
Dear All,
I have a doubt over here...In my frame, I have two buttons...one is "START" and the other is "STOP". If the "START" button is clicked, i am calling a method in which a "FOR LOOP" will start running for 100 times. If the "STOP" button is clicked, I should stop the said for loop, in the middle itself....how to do the above...
any suggestions, solutions, ideas are higly appreciated...
bye,
Sakthivel S.u can use a boolean variable for that.in ur loop check that boolean if it is true perform the loop task.and when stop is pressed make that boolean false.and in ur loop if boolean is fale break the loop.i hope u r also using thread.sleep to minimize the processor usage.
-
Stopping a For Loop, part 2
Hello. Thank you everyone for your help, getting to this point. I asked for help to create a stop condition, while a For Loop is running. I was given many ideas and selected the one that used local variables. It works well however, if I am in the "Test in progress" state, in the first For Loop, and the "Stop" button is selected from the front panel, when it stops the Vi, it sends the value "5" to the second For Loop before going to the "End" state, which puts it to "0", then stops the Vi. What this Vi is doing is feeding 0-200VDC signal to an eddy current sensor, then it feeds 200-0VDC going the other direction. I have tried sequencing, putting in timers and a few other goofy things but I can not get the Vi to stop in the first For Loop, without the Vi performing the initial "5" to the second For Loop. Someone had mentioned using an event handler, in my previous post. I practiced for quite some time, trying to understand how to use an event handler but am not much the wiser. Any and all input would be greatly appreciated.
altenbach wrote:
ceilingwalker wrote:
You are autoindexing way too many thing between the two FOR loops I was doing this to create a data dependency, at least that was my thought process behind it. As far as the physical channels and VISA refnums, I did it this way so I didn't create more controls for the front panel. Being my first project, I am very certain my logic is flawed, this is why I like posting here and getting feedback from
You have many visa sessions that (hopefully) never change during the execution of the loops, so why woold you turn them into an array of 11 identical elements just to autoidex them out again at the next loop. Change the tunnels to no autoindexing and things would look cleaner. Why are these session controls inside the loop? Are you expect them to be changeable during loop execution or would that screw up the results?
Wounld't it be easier to simply create an up&down ramp once and use a single FOR loop, autoindexing on the ramp? You have way too much duplicate code!!!
If you don't want the second loop to run when the first one is ended prematurely with the stop button, put it in a case structure I tried a Case structure for the second For Loop. I couldn't find a way to change conditions that didn't affect the Vi's overall performance.
Then show us what you tried! That should be trivial to implement. Why would a case structure affect performance? Makes no sense!
Why would a case structure affect performance? Makes no sense! I used a boolean operator to change the state. When I used a false, it worked for that problem but shut down my Vi before the second For Loop.
Wounld't it be easier to simply create an up&down ramp once and use a single FOR loop, autoindexing on the ramp? You have way too much duplicate code!!! I tried using one For Loop to begin with but because I had to ramp up, then ramp down, I couldn't figure out how to use just one. I needed an Add function for the ramp up and a Subtract function for the ramp down.
Why are these session controls inside the loop? Are you expect them to be changeable during loop execution or would that screw up the results? No Sir, the values are not changed during operation. I did this because I wanted it to display the data on the front panel, during operation of the Vi. For display only.
Maybe you are looking for
-
hi experts.. i have the following query SELECT T0.[DocNum]'u03A4u03B9u03BCu03BFu03BBόu03B3u03B9u03BF u03A0ώu03BBu03B7u03C3u03B7u03C2', p.Docnum'u03A4u03B9u03BCu03BFu03BBόu03B3u03B9u03BF u03A0u03C1u03BFu03BCu03B7u03B8u03B5u03B9ώu03BD', p.docdate, pp.C
-
Discovered my 3GS no longer shows on the calendar nonrepeating events before 9/23/12. However, those events show in icloud and on my laptop. We tried reloading icloud but still missing. Guess is due to downloading of IOS6 - if so, why didn't Apple le
-
Is there a way to export selected photo's from iphoto directly to the idisc public folder. I don't want these photo's and video's on my gallery, I just want to share a link with someone and allow them to download them. Can this be done within iphoto
-
Failure to verify mail account...
I just restored a new iPad with the backup information from another iPad and am now having issues with mail accounts, specifically Yahoo. I tried deleting the account and re-entering the information but while it is trying to verify I keep getting the
-
I need to install software on a computer without a dvd drive. Where can I find the download for the student edition?