How to skip for loop execution
Hi all,
How to skip execution of for loop , if one particular condition is satisfied within that loop .
I know that we can use exit within for loop to come out of for loop, please let me know if there is any other approach .
Thanks,
P Prakash
BluShadow wrote:
11g (new feature) - it is called the CONTINUE statement.Blergh! it's horrible. May as well use a GOTO.... :{noformat}/{noformat}Hehe.. Yeah - it essentially creates another exit point in the loop, except that it falls into the top of the loop and not out of the bottom.
So in that respect, the EXIT statement ain't much better. {noformat} ;-) {noformat}
Personally I don't think it that bad - could be useful for very tight loops where you want to cut down machine code to the absolute minimum. But then why would one ever write such a loop in PL/SQL?
Reserving judgement on this one for the time being. I very very seldom have used a continue or skip instruction in programming... As far as I recall - only in bash shell scripts.
So yeah, I would like to see the code and justification for that code using the CONTINUE statement. There always could be The Real And Seldom Seen Bigfoot-like Exception that justifies using that statement... {noformat} :-) {noformat}
Similar Messages
-
How to make for loop pass only once in a next() method
Good Day!
Can anyone help me or suggest any idea to resolve my problem with the below code, wherein it will only pass the for loop only once. I already tried inserting the for loop in side the if (sqlset4.isFirst()) condition but the problem is it only retrieved the first row of the resultset.
Cheers!
Statement sOutput = consrc.createStatement();
ResultSet sqlset4 = sOutput.executeQuery(xquery);
ResultSetMetaData rsMetaData = sqlset4.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();
String writefld = "";
while (sqlset4.next()) {
writefld = "";
for (int i = 1; i <= numberOfColumns; i++) {
if (xxformatid.equals("1") || xxformatid.equals("3")) {
writefld = writefld + "sqlset4.getString(" + i + ").trim()" + "|";
writefld = writefld.substring(0, writefld.length() - 1) + ")";
output.write("\r\n");
output.write(writefld);
output.close();I am using Netbean IDE 6.8
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64biHi everyone!
What I actually trying to do is that I have a multiple tables and from these tables I'm going to write each of it into a flatfile that is a pipe delimeted that is why I have to make a loop to know how many fields I am going to write. The code that was attached are actually working, my only concern is that it will take a longer time of processing cause every record of a table it will pass to the for loop(checking how many column) wherein number of column/ were already known on the first loop.
Hi kajbj,
I think what your trying to explain is almost the same with below code which i had already tried. The problem with this is that the every loop of the outer loop data retrieve is only the data of the first record.
Statement sOutput = consrc.createStatement();
ResultSet sqlset4 = sOutput.executeQuery(xquery);
ResultSetMetaData rsMetaData = sqlset4.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();
String writefld = "";
while (sqlset4.next()) {
writefld = "";
if (sqlset4.isFirst()) {
for (int i = 1; i <= numberOfColumns; i++) {
if (xxformatid.equals("1") || xxformatid.equals("3")) {
writefld = writefld + "sqlset4.getString(" + i + ").trim()" + "|";
writefld = writefld.substring(0, writefld.length() - 1) ;
output.write("\r\n");
output.write(writefld);
output.close(); -
How to use for loops with Multiple Initializers and Incrementers
I found that my for loop is printing out wrong, because I am using two for loops. I have searched but all I can find out is you can't use multiple inializers and increments, does anyone know how to get around this? How would I use an array for this?
Thanks very much for your help.
import java.util.Random;
import java.util.Arrays;
/** Generate numnodes value for random integers in the range 0..499. */
public final class RandomInteger {
public static final void main(String... aArgs){
log("Generating 6 random integers in range 0..499.");
int numnodes = 6;
//Randomly generate a number between 0 and 499 for the x and y coordinates for the nodes
Random randomGenerator = new Random();
for (int x = 0; x < numnodes; ++x) {
int randomInt = randomGenerator.nextInt(500);
Random randomGenerator2 = new Random();
for (int y = 0;y < numnodes; ++y) {
int randomInt2 = randomGenerator2.nextInt(500);
log("Generated : " + randomInt + " " + randomInt2);
log("Done.");
}Sorry that code works, but I want to use both my x and y coordinates to get a random number from 0 to 499 in both of them, then I want to do some comparisons of the values, then return it to another function. As it stands now, I get the wrong results when I run it, as you can see at the bottom.
Thanks very much for your help. I have been stumped all mornign on this and have looked everywhere trying to find an example. I don't won't to use math random. I am on a tight deadline to finish and at the rate I am going, I will not complete it.
/** Generate numnodes value for random integers in
the range 0..499. */
public final class RandomInteger {
public static final void main(String... aArgs){
log("Generating 6 random integers in range
0..499.");
int numnodes = 6;
//Randomly generate a number between 0 and 499 for
the x and y coordinates for the nodes
Random randomGenerator = new Random();
for (int x = 0; x < numnodes; ++x) {
int randomInt = randomGenerator.nextInt(500);
Random randomGenerator2 = new Random();
for (int y = 0;y < numnodes; ++y) {
int randomInt2 = randomGenerator2.nextInt(500);
log("Generated : " + randomInt + " " + randomInt2);
log("Done.");
private static void log(String aMessage){
System.out.println(aMessage);
Output:
--------------------Configuration:
<Default>--------------------
Generating 6 random integers in range 0..499.
Generated : 98 254
Generated : 98 347
Generated : 98 359
Generated : 98 25
Generated : 98 277
Generated : 98 148
Generated : 416 401
Generated : 416 165
Generated : 416 354
Generated : 416 169
Generated : 416 144
Generated : 416 354
Generated : 295 158
Generated : 295 138
Generated : 295 349
Generated : 295 324
Generated : 295 18
Generated : 295 193
Generated : 197 451
Generated : 197 416
Generated : 197 480
Generated : 197 33
Generated : 197 490
Generated : 197 494
Generated : 324 412
Generated : 324 490
Generated : 324 213
Generated : 324 386
Generated : 324 467
Generated : 324 163
Generated : 379 180
Generated : 379 446
Generated : 379 314
Generated : 379 52
Generated : 379 113
Generated : 379 271
Done.
Process completed. -
How to use For Each execution in OSB
hi all,
I'm confused about the 'For Each' action in OSB. Now, I have a variable('max') which equals to 3 , and I wanna to use For Each action to perform a loop execution, something like for(1 to 3)--
The code is like below:
For Each variable 'value' of variable 'max' ,
Do{
Assign value to variable tempMsg;
Service Callout to PS with tempMsg
What I think is the 'value' should be increased from 1 to 3 itself, and the service callout should be performed by 3 times with '1', '2', '3'. However, it's not, the service callout action was performed once with the value of 3, just like the 1 and 2 were overwritten.
Any idea?Using 'For Each' activity in OSB
Thanks,
Vijay -
How convert java FOR loop into taglib directive
hi all,
I have following code in my Jsp. It is working but, we dont want to use java FOR loop anymore. Instead use corresponding taglib directive.
How can i convert this Java FOR loop into taglib implementation of FOR loop ?
<%
for(int i=0;i< arrMemberBenefit.length;i++) {
pageContext.setAttribute("arrMemberBenefiti", arrMemberBenefit);
System.out.println("PCPNAME: " + arrMemberBenefit[0].getPcpName());
%>
<tr class="rowOdd">
<td headers="t1h1" class="first"><c:out value="${arrMemberBenefiti.member.firstName}${space}${arrMemberBenefiti.member.lastName}" /></td>
<td headers="t1h2" class="last"><c:out value="${arrMemberBenefiti.pcpName}" /></td>
</tr>
<%}
%>
pl any help highly apprecialted
ppUsing the JSTL forEach tag:
I have used your variable name for arrMemberBenefiti
myself I would probably call it something like memberBenefit
You may need to put the array into an attribute to begin with
// just in case
<% pageContext.setAttribute("arrMemberBenefit", arrMemberBenefit); %>
// and the actual JSTL loop
<c:forEach var="arrMemberBenefiti" items="${arrMemberBenefit}">
<tr class="rowOdd">
<td headers="t1h1" class="first"><c:out value="${arrMemberBenefiti.member.firstName}${space}${arrMemberBenefiti.member. lastName}" /></td>
<td headers="t1h2" class="last"><c:out value="${arrMemberBenefiti.pcpName}" /></td>
</tr>
</c:forEach>Cheers,
evnafets -
How to write "for loop" for this block in as3?
hello all, could you please help me to write a for loop for the following code?
PS: bx1,bx,2bx3... are movie clips, xfir1,xsay1,xad1,xtip1,xdil1 are dynamic text boxes.
var xmlLoader9:URLLoader = new URLLoader();
xmlLoader9.addEventListener(Event.COMPLETE, showXML99);
xmlLoader9.load(new URLRequest("spops.xml"));
function showXML99(e:Event):void
XML.ignoreWhitespace = true;
var fir:XML = new XML(e.target.data);
bx1.xfir1.text = fir.sno[0].aa.text();
bx1.xsay1.text = fir.sno[0].bb.text();
bx1.xad1.text = fir.sno[0].cc.text();
bx1.xtip1.text = fir.sno[0].dd.text();
bx1.xdil1.text = fir.sno[0].ee.text();
bx2.xfir2.text = fir.sno[1].aa.text();
bx2.xsay2.text = fir.sno[1].bb.text();
bx2.xad2.text = fir.sno[1].cc.text();
bx2.xtip2.text = fir.sno[1].dd.text();
bx2.xdil2.text = fir.sno[1].ee.text();
bx3.xfir3.text = fir.sno[2].aa.text();
bx3.xsay3.text = fir.sno[2].b.text();
bx3.xad3.text = fir.sno[2].cc.text();
bx3.xtip3.text = fir.sno[2].dd.text();
bx3.xdil3.text = fir.sno[2].ee.text();And for the second, try this:
var stThings:Array = [st1, st2, st3];
var bxThings:Array = [bx1, bx2, bx3]
var globalURLRequest:URLRequest = new URLRequest ("tgs.aspx?st=1003")
for each(var stWhat in stThings)
stWhat.addEventListener(MouseEvent.CLICK, clickHandler);
stWhat.addEventListener(MouseEvent.MOUSE_OVER, overHandler);
stWhat.addEventListener(MouseEvent.MOUSE_OUT , outHandler);
function clickHandler(event:MouseEvent):void
navigateToURL(globalURLRequest,"_blank")
function overHandler(event:MouseEvent):void
var index:int = stThings.indexOf(event.target);
bxThings[index].visible = true;
function outHandler(event:MouseEvent):void
var index:int = stThings.indexOf(event.target);
bxThings[index].visible = false;
It's difficult to interpret your code--you may want to take some time to write more readable code.
For example, what is an 'st1'? Is it a button? What does it do?
Consider if it were a button made to load Story 1... a much more readable name would be btnStory1.
Also, there really is no advantage to identifying events as eeeeevt, zeeeevt and changing those.
Pick a convention and stick to it. I prefer 'event', others use 'e' or 'evt'.
And try to use function names that mean something, "function a1003mo(zeeevt2:MouseEvent):void {" is much more easily read as "function outHandler(event:MouseEvent):void"
I'd be interested to see what it is you're making, I believe there are some real opportunities to optimize it.
HTH
-Ted -
How to create for loop USING a while loop
Hi, I would like make a for loop inside of a while loop because I want to control the i count of the loop, and overall, more control over the loop. From what I understand, labVIEW's for loop doesn't let me change where the i count starts. It always start at i=0, and what I want to do is be able to jump to specific loop iterations and then continue from there.
Thank you.That is not the same as the earlier examples.
If you want 10 counts and start at 0, then the stop terminal will stop after 10 times. Just like you get when you wire 10 into the N terminal and don't have a conditional loop.
If your start value is larger, let's say 9, then your loop will only run 1 time because i=0 on first iteration + 1+ 9 (start value). 0 + 1 +9 = 10.
If your start value is larger than 10, then it will run 10 times again because on the intial iteration the result of your comparison is already greater than 10 and won't stop, and will never be equal on later iterations.
So your example does not even give consistent results depending on the value you use as the start value.
(Just to note, my earlier examples may not all be identical results as I didn't try to verify all the stop conditions nor the array that is output by the ramp function. I could be off by one iteration here or there. But they should be good enough to point out distinctive ways to accomplish what the OP asked for.) -
FOR loop messes up the DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
Hello!
I've encountered the following problem which could be resolved for now
by eliminating FOR loop, but that's not a good solution.
The problem is that if some exception is raised inside the `for' loop
with cursor, and the outer block contains exception handler with
`format_error_backtrace' call, the last one shows not the exact line
where the exception was raised, but the loop beginning. Let me show
you.
The next block loops over some table and tries to assign one of the
field's value to local variable with intentionally low
precision. Please look at line where exception is raised:
========================================
SQL> ed
Wrote file afiedt.buf
1 declare
2 x number(1);
3 begin
4 for x_r in (select xlong from xtable)
5 loop
6 dbms_output.put_line('Processing... '|| x_r.xlong);
7 x := x_r.xlong;
8 end loop;
9* end;
SQL> /
Processing... 611911
declare
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 7========================================
Next, I'll put exception handler with `format_error_message' call in
it:
========================================
SQL> ed
Wrote file afiedt.buf
1 declare
2 x number(1);
3 begin
4 for x_r in (select xlong from xtable)
5 loop
6 dbms_output.put_line('Processing... '|| x_r.xlong);
7 x := x_r.xlong;
8 end loop;
9 exception
10 when others then
11 dbms_output.put_line(dbms_utility.format_error_backtrace);
12* end;
SQL> /
Processing... 611911
ORA-06512: at line 4========================================
Now look how line number changed; instead of 7'th line it is 4'th
now -- at the beginning of the loop.
Now, let's expand this loop into explicit open/fetch/close sequence:
========================================
SQL> ed
Wrote file afiedt.buf
1 declare
2 x number(1);
3 cursor x_c is select xlong from xtable;
4 x_r x_c%rowtype;
5 begin
6 open x_c;
7 loop
8 fetch x_c into x_r;
9 exit when x_c%notfound;
10 dbms_output.put_line('Processing... '|| x_r.xlong);
11 x := x_r.xlong;
12 end loop;
13 close x_c;
14 exception
15 when others then
16 dbms_output.put_line(dbms_utility.format_error_backtrace);
17* end;
SQL> /
Processing... 611911
ORA-06512: at line 11========================================
Here we see that line number where exception was raised is now
correct!
I suppose the problem is in some hidden exception handling behind the
`for' loop execution. Any help will be appreciated, thanks in advance!
Message was edited by:
uj2uj2,
I think the reason is probably PL/SQL optimisation. Because you are using backtrace, it means you are on 10g. This means you have an automatic PLSQL_OPTIMIZE_LEVEL of 2. At this level, the compiler will re-write your cursor-for-loop to array fetches "under the covers", so my feeling is that the internal code re-organisation might have something to do with it.
Can you try your cursor-for-loop example with these settings:
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 0;
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 1;
Neither of these levels optimise cursor-for-loops.
The reason your explicit fetch doesn't display the same behaviour is that the compiler doesn't optimise those.
Of course I could be wrong, but this is where I'd start testing.
Regards -
Nested for loop in the collections
Hi Experts,
collection1
============
SELECT o.object_id
BULK COLLECT INTO l_obj_info
FROM (SELECT n.node_id, n.object_id
FROM nodes n
START WITH n.node_id = 100
CONNECT BY PRIOR n.node_id = n.parent_node_id) n
INNER JOIN
objects o ON n.object_id = o.object_id
WHERE o.object_type_id = 285;
collection2
============
SELECT *
BULK COLLECT INTO l_tab
FROM ((SELECT REGEXP_SUBSTR (i_l_text, '[^,]+', 1, LEVEL)
FROM DUAL
CONNECT BY REGEXP_SUBSTR (i_l_text, '[^,]+', 1, LEVEL) IS NOT NULL));
END;
collection3
============
SELECT o.object_id
BULK COLLECT INTO l_fin_tab
FROM objects o JOIN ATTRIBUTES att
ON o.object_id = att.object_id
WHERE o.object_id = collection1.object_id
--AND att.VALUE = collection2.val;
Please tell me how to implement for loop in the collection3 to get the values from collection1 and collection2.
i have tried in the below way
CREATE OR REPLACE TYPE LIST_OF_ATTRIBUTES_TYPE AS TABLE OF varchar2(4000);
CREATE OR REPLACE TYPE LIST_OF_OBJECT_IDS_TYPE AS TABLE OF number(9);
CREATE OR REPLACE FUNCTION f_get_objects_by_type_id (
i_object_type_id IN NUMBER,
i_l_text IN VARCHAR2,
i_scope_node_id NUMBER
RETURN list_of_object_ids_type
AS
CURSOR objs_info
IS
SELECT o.object_id
FROM (SELECT n.node_id, n.object_id
FROM nodes n
START WITH n.node_id = i_scope_node_id
CONNECT BY PRIOR n.node_id = n.parent_node_id) n
INNER JOIN
objects o ON n.object_id = o.object_id
WHERE o.object_type_id = i_object_type_id;
l_tab list_of_attributes_type := list_of_attributes_type ();
--l_obj_info list_of_object_ids_type := list_of_object_ids_type ();
l_fin_tab list_of_object_ids_type := list_of_object_ids_type ();
BEGIN
BEGIN
SELECT *
BULK COLLECT INTO l_tab
FROM ((SELECT trREGEXP_SUBSTR (i_l_text, '[^,]+', 1, LEVEL)
FROM DUAL
CONNECT BY REGEXP_SUBSTR (i_l_text, '[^,]+', 1, LEVEL) IS NOT NULL));
END;
IF l_tab.COUNT > 0
THEN
FOR i IN objs_info
LOOP
FOR j IN l_tab.FIRST .. l_tab.LAST
LOOP
SELECT o.object_id
BULK COLLECT INTO l_fin_tab
FROM objects o JOIN ATTRIBUTES att ON o.object_id =
att.object_id
WHERE
att.VALUE = l_tab (j) and o.object_id =objs_info(i);
END LOOP;
END LOOP;
END IF;
RETURN l_fin_tab;
END f_get_objects_by_type_id;Why are you wanting to do this?
It looks like you are trying to implement SQL joins in PL code. Not only is that using up expensive PGA memory by storing the data in collections, but doing such retrieval of data to try and join it in PL loops, is never going to be as fast as just joining the SQL queries using SQL itself.
Post some example data and your database version, with an example of what the output should look like from that example data.
Re: 2. How do I ask a question on the forums? -
For loop to iterate through temp table in store procedure in pl/sql
Hi,
how to create For loop to iterate through the temporary table in the store procedure?Neha RK wrote:
hi,
its not working , i need to check each record of table and do some task using if else loop inside that for..
if not possible to loop each row of table using for then how to use while loop.
please helpWhat's not working? We haven't got psychic powers so we can't see the code you say isn't working.
Please provide more information like create table statements, insert statements with test data, the code you've tried
and the output you are expecting from the input data.
Read {message:id=9360002} and follow the advice there. -
Nested For Loop Trouble?
Ok I need to have a nested for loop that asks a user to enter in a int number from 1-50. Whatever the number is, lets say 4 I need the program to count up asterisk and count down asterisks, like this.
This is my code:
import java.io.*;
public class Stars {
static int n;
static private InputStreamReader in = new InputStreamReader(System.in);
static private BufferedReader br = new BufferedReader(in);
public static void main(String[] Args)throws IOException
System.out.println("Please enter in a number to see display: ");
String num = br.readLine();
n=Integer.parseInt(num);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
System.out.print("*");
for(int j=1;j<=i;j--)
System.out.print("*");
System.out.println();
Can someone tell me what I am doing wrong so I can figure out my mistake(s).Ok, well I know that the loop relies on the number entered in by the user. So if i pick 3 the three enter in the loop and counts up in a for loop and for every number it counts up to the three it does a print("*"); Now what I am getting confused about is where the other for loop comes into play. I know that I need to start from the number I have which is 3, so I need to have one less than that and then count down. The thing is that i'm not sure where or how the second for loop gets implemented into the code. Does it get nested with the first loop like this:
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
for(int j=n-1;j>=i;j--)
System.out.print("*");
System.out.println();
}Or is the second for loop on its own like this:
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
System.out.print("*");
for(int j=n-1;j>=i;j--)
System.out.print("*");
System.out.println();
}If someone can help me understand, for this is my first time with nested for loops. -
How to get the elements out of a for loop simultaneously during the loop execution
Hi,
I am student. I would like to know how to get the counter values outside the For loop parallely while the loop runs rather that getting the finally value outside the For loop. Looking forward for answers.
Thanks,
Athira
Solved!
Go to Solution.You could use a notifier (since it is a single value) or a reference (with a property node) to a control that gets the value elsewhere in another VI.
If it is within the same VI, you could use a property node (right click > create > property node > value) from the control within the same VI located outside the loop.
If you promiss NOT to abuse the use of Local Variables, you could use that to only write from ONE location within the For Loop to a control outside the loop, similar to the property node mentionned earlier. (Of course, I will be struct by lightening for mentionning that and scolded by other LabVIEW coders for having a change of heart on the use of Locals.... Shivers are already crawling up my spine).
You could use a queue, but that might be an overkill, unless: the count is generated faster than it is being read elsewhere...
As crossrulz mentionned, can you describe what you will be doing with the count? Because synchronizing data (fresh / stale / etc) is very important within LabVIEW as it executes based on dataflow rather than a sequential order.
Hope this helps.
EDIT:
You have not fully provided the answer. We figured that much of your code from your description, but what is reading the value of the count? Is it in a separate loop? If not, it may only deal with the first value, which is likely 0. The proper advice depends on how you process the received data (count). -
How to skip existing execution plan for a query
Hi,
I want to skip existng execution plan for a query which I am executing often. I dont want it to use the same execution plan everytime. Please let me know if any method is there skip the existing execution plan.
Thanks in advance.......
Edited by: 900105 on Dec 1, 2011 4:52 AMChange the query so it is syntactically different, but has the same semantics (meaning). That way CBO will reparse it and you might get a new execution plan.
One simple way to do that is to add a dummy predicate ( 45=45) to the where clause. The predicate must be changed every time the query is executed ( 46=46 , 47=47 ,… ).
Iordan Iotzov
http://iiotzov.wordpress.com/ -
How do i sweep two voltage at the same time by using for loop ?
Hello, Can anyone help me on this topic ?
My problem is to sweep Vds and Vgs as same time vs Id in MOSFET by using for loop. I also use the Agilent power supply source. Let me tell a litle bit about what i'm doing. For different value of Vds, i will get Vgs vs Id curve. (The x axis is Vgs, the y-axis is Id).
I started to create two for-loop, the inner to sweep Vgs, and the outer one to sweep Vds. My problem is don't know how to connect all the wire in the for loop.
In the for loop i saw N, i icon. Suppose I have the two variable for Vgs such as Vgs start and Vgs_stop. Should the Vgs_start( or Vgs_stop) be connected to N or leave it in the for_loop ?
for example: I want to sweep Vgs from 0(for Vgs_start) to 5(Vgs_strop) V, and the step increment is .5V how do i connect these variables in the for loop ?
Thank you for your time
Ti NguyenIt is easier to use a while loop. Dennis beat me to the punch. Here is my solution:
You can remove the flat sequence structure if you use Error In and Error Out to ensure the execution flow will occur in the proper order. Be sure to include the delay time in the loop so that your vi doesn't hog all the CPU time.
Message Edited by tbob on 10-17-2005 01:00 PM
- tbob
Inventor of the WORM Global
Attachments:
RampVoltage.PNG 8 KB -
I've attached a sample VI that I just cannot figure out how to get working the way that I want. I've labeled the some sections with black-on-yellow text boxes for clarity during the description that follows in the next few sentences. Here's what I want:
1) overall -- i'm intend for this to be a subVI that will do data acquisition and write the data to a file. I want it to use a producer/consumer approach. The producer construct is the 'parallel for loop' that runs an exact number of times depending on user input (which will come from the mainVI that is not included). For now I've wired a 1-D array w/ 2 elements as a test case. During the producer loop, the data is acquired and put into a queue to be delt with in the consumer loop (for now, i just add a random number to the queue).
2) the consumer construct is the 'parallel while loop'. It will dequeue elements and write them to a file. I want this to keep running continuously and parallel until two conditions are met.
i. the for loop has finished execution
ii. the queue is empty.
when the conditions are met, the while loop will exit, close the queue, and the subVI will finish. (and return stuff to mainVI that i can deal with on my own)
Here's the problems.
1) in the "parallel for loop" I have a flat sequence structure.. I haven't had time to incorporate some data dependency into these two sequential sections, but basically, I just care that the "inner while loop" condition is met before the data is collected and queued. I think I can do this on my own, but if you have suggestions, I'm interested.
2) I can easily get the outer for and while loops to run sequentially, but I want them to run in parallel. My reasoning for this is that that I anticipate the two tasks taking very different amounts of time. .. basically, I want the while loop to just keep polling the queue to get everything out of it (or I suppose I could somehow use notifiers - suggestions welcome)... the thing is, this loop will probably run faster than the for loop, so just checking to see that the queue is empty will not work... I need to meet the additional condition that nothing else will be placed in the queue - and this condition is met when the for loop is complete. basically, I just can't figure out how to do this.
3) for now, I've placed a simple stop button in the 'parallel while loop', but I must be missing something fundamental here, because the stop button is totally unresponsive. i.e. - when I press it, it stays depressed, and nothing happens.
suggestions are totally welcome!
thanks,
-Z
Attachments:
daq01v1.vi 59 KBI'd actually like to add a little more, since I thought about it a bit and I'm still not quite certain I understand the sequence of events...
altenbach wrote:
zskillz wrote:
So i read a bit more about the 'dequeue element' function, and as I understand it, since there is no timeout wired to the dequeue element function, it will wait forever, thus the race condition I suggested above can never happen!
Yes, you got it!
As I've thought about it a bit more, there's a few things that surprise me... first, the reason the 'dequeue element while loop' errors is not because there's nothing in the queue, it's becaues the queue has been released and it's trying to access that released queue... However the problem I have is this --- Even though there's no timeout wired to the dequeue element, I still would think that the while loop that contains it would continue to run at whatever pace it wanted -- and as i said before.. most of the time, it would find that there is nothing to dequeue, but once in a while, something is there. however, it seems that this loop only runs when something has been enqueued. the reason I say this is illustrated in the next code sample MODv2 that's attached below. I've added a stop button to the "queue size while loop" so the program runs until that is pressed. I've also added a simple conditional in the "dequeue while loop" that generates a random number if it a button is pressed... but this button is totally non-responsive... which means to me that the "dequeue while loop" isn't actually continuously running, but only when an element is added to the queue. this still seems almost like the 'dequeue while loop" waits for a notifier from the queue telling it to run. can you explain this to me? because it is different from what I expect to be happening.
rasputin wrote:
I tried to open your VIs but it doesn't work. LV
is launched, the dialog box (new, open, configure...) opens and then...
nothing. Not even an error message. I guess it isn't a problem of LV
version or a dialog box would appear saying this. Could you, please,
send a image of the code?
Thanks,
Hi Rasputin, I'm using LV8. I assume that was your problem, but who knows. I've attached a pic of of altenbach's solution since it's what I needed.
thanks
-Z
Message Edited by zskillz on 10-20-2006 11:49 AM
Attachments:
daq01v1MODv2.vi 63 KB
daq01v1MODpic.JPG 116 KB
Maybe you are looking for
-
How to browse a local PC directory and filename in Forms 10g?
I am adding a Text Item and a Push Button. When the Push Button is pressed, I would like to select files from the local PC on Windows XP. What is the code that is required in order to select folder and filename and pass the value to a Text Item?
-
We are on 11.1.0.7 I am looking for some inputs from someone who has already seen this behavior. We have two identical schemas, and an identical table in each of this schema with same in structure and around 8 indexes on these tables. For one schema,
-
How to move documents from one iPad to another iPad?
I have a new iPad and want to move my documents. Is there a quick way to do this?
-
SCCM WSUS Deployment Package Confirmation
Hello, Our WSUS setup is pretty much finalized but wanted a quick clarification so I can draw out a procedure. Let's assume I have 400 security updates that I need to make sure are deployed and I have E:\WSUS\Security Updates. I'm going to make 4 Sof
-
Creating standby on unpatched server
hi , I have primary db on oracle 9.2.0.8 with CPU April 2009 patch , can I create physical standby db on oracle home 9.2.0.8 without any patch ? is that OK if I switch my primary db over to the non patched server ? thanks tapash