SRL Archive - Help

Empty loop, how to avoid them?


eska

2012-03-19 17:42:57

I'm making a monkey thiever script, and making sure that it can escape the prison by itself.
LockPickJailDoor picklock the door and make sure that it successfully picklocked it with various fail safe. I want it to try again if it failled (which is why there is a loop there. A simple if statement isn't enough.

  
MarkTime(t);
repeat
until (TimeFromMark(t) > 6000) or LockPickJailDoor;

Now as you can see, this code compiles, it works, but it does alot of instruction. It waste ressources. My bad, it doesn't, because it waits for the return value of LockPickJailDoor to continue looping.

I know some of you will tell me: Put a wait in there like this. Problem solved!
  
MarkTime(t);
repeat
Wait(1000 + Random(500));
until (TimeFromMark(t) > 6000) or LockPickJailDoor;

But no… that's not fixing a problem, thats just a work around in my opinion. I want a real solution.
My programming teacher would burn me at the stake if I gave him a solution like this.

Is there a way to avoid this problem?

Right now I'm thinking about adding recursivity in the LockPickJailDoor function so that when it fail to lockpick, we give up and logout, or if it is succesfull, we proceed with escaping the prison.

Kyle Undefined

2012-03-19 17:50:46

Or something like this:


MarkTime(t);
while(not(LockPickJailDoor))do
begin
if(TimeFromMark(t) > 6000)then
Break;
Wait(750);
end;

Since it will check the LockPickJailDoor value before continuing the loop.

Sin

2012-03-19 17:51:32

Use a while..do loop.

E*
FFS STUPID 60 SECOND TIMER

nickrules

2012-03-19 17:53:54

From: sir eska eau
I'm making a monkey thiever script, and making sure that it can escape the prison by itself.
LockPickJailDoor picklock the door and make sure that it successfully picklocked it with various fail safe. I want it to try again if it failled (which is why there is a loop there. A simple if statement isn't enough.

  
MarkTime(t);
repeat
until (TimeFromMark(t) > 6000) or LockPickJailDoor;

Now as you can see, this code compiles, it works, but it does alot of instruction. It waste ressources.

I know some of you will tell me: Put a wait in there like this. Problem solved!
  
MarkTime(t);
repeat
until (TimeFromMark(t) > 6000) or LockPickJailDoor;

But no… that's not fixing a problem, thats just a work around in my opinion. I want a real solution.

Is there a way to avoid this problem?

Right now I'm thinking about adding recursivity in the LockPickJailDoor function so that when it fail to lockpick, we give up and logout, or if it is succesfull, we proceed with escaping the prison.


Reducing the number of actions performed (by adding a wait) is by no means a workaround. However, if you insist on not doing that, then just throw FindBlackChatMessage(ChatMsg: string) into your lockpickjaildoor function. Then just set the player false (but hey, you should be doing putting things like that in by default anyways ;)).


@Kyle I don't understand how that's at all different from just adding a wait….

eska

2012-03-19 17:57:07

From: nickrules
Reducing the number of actions performed (by adding a wait) is by no means a workaround. However, if you insist on not doing that, then just throw FindBlackChatMessage(ChatMsg: string) into your lockpickjaildoor function. Then just set the player false (but hey, you should be doing putting things like that in by default anyways ;)).

Funny you say all that because that's exacly what I did, I must be on the good track.

FindBlackChatMessage(ChatMsg: string) -> already doing that lol
But it isn't enough, because you can fail to find the object, or fail to picklock the door even if you click it.
You must be able to try again if one of those happen.
I haven't added multiplayer yet but the player false is basicaly exacly what I was saying when I said we "give up" and logout.

And @ kyle, you did the same thing as me with another kind of loop. It's still and empty loop.

eska

2012-03-19 17:58:27

From: Sin
Use a while..do loop.

E*
FFS STUPID 60 SECOND TIMER


That stupid 60 second timer is a failsafe to make sure you don't stay stuck in prison for 6 hours.

I don't know how you could see this as stupid in any way.

nickrules

2012-03-19 18:01:24

From: sir eska eau
That stupid 60 second timer is a failsafe to make sure you don't stay stuck in prison for 6 hours.

Not too sure it's that stupid.


He got ninja'd. 60 second timer between posts.

Anyways, there's really no way to avoid an "empty" loop here. You could maybe call antiban, if your really want.

E: @OP, the loop will not restart until it has tested all break parameters. Which means that it's not calling your lockpick function as fast as it can, it's calling it, waiting for it to finish, then checking the time, and repeating. I think that might be your concern.

Kyle Undefined

2012-03-19 18:03:21

Technically, your function should handle that loop. You should just call that function and check if it returns True/False.

Sin

2012-03-19 18:04:56

From: nickrules
He got ninja'd. 60 second timer between posts.

Anyways, there's really no way to avoid an "empty" loop here. You could maybe call antiban, if your really want.

E: @OP, the loop will not restart until it has tested all break parameters. Which means that it's not calling your lockpick function as fast as it can, it's calling it, waiting for it to finish, then checking the time, and repeating. I think that might be your concern.


From: sir eska eau
That stupid 60 second timer is a failsafe to make sure you don't stay stuck in prison for 6 hours.

I don't know how you could see this as stupid in any way.




:duh: x1000.

eska

2012-03-19 18:10:01

From: Kyle Undefined
Technically, your function should handle that loop. You should just call that function and check if it returns True/False.


Yes I was thinking about this, but the fact remains that it is an empty loop.
The objective of a loop is to to repeat code inside the loop. Not outside of it in the condition.

I know you can't do multithreading in pascal but a loop like this is basicaly busy waiting, and busy waiting isn't the way to go.

@ Sin
I'm not used to spam the forum so I didn't knew there was a 60000 timer, and to add to the confusion, I also had a 60000 timer in my loop lol..

bolshak25

2012-03-19 18:12:03

MarkTime(t);
repeat
If LockPickJailDoor then
break;
until (TimeFromMark(t) > 6000)
no longer empty and eith item will break you out

eska

2012-03-19 18:16:48

From: bolshak25
MarkTime(t);
repeat
If LockPickJailDoor then
break;
until (TimeFromMark(t) > 6000)
no longer empty and eith item will break you out


Still the same as the other loop, you just broke the condition in 2 part.

I'm watching at my code of PickLockDoor and realise that I could easily implement the check without using an empty loop. I don't know how come I haven't noticed it before.

But from watching all the srl member posting the same solution I guess there is no real way to avoid empty loop.

E: typo, by the way thanks guys for the suggestions.

nickrules

2012-03-19 18:45:21

From: sir eska eau
I guess there is no real way to avoid empty loop.


There really isn't, because you can't multithread. If you're not waiting for a wait in your loop, then you're waiting for something else (antiban? Time check? Doesn't matter what). But you're waiting for something, no matter what.

masterBB

2012-03-19 19:05:12

WaitFunc(@LockPickJailDoor,100,6000); 

Also you need that wait. Do you expect your CPU to run at 100% till it finds the door or the time has passed?

eska

2012-03-19 19:12:40

From: masterBB
WaitFunc(@LockPickJailDoor,100,6000); 

Also you need that wait. Do you expect your CPU to run at 100% till it finds the door or the time has passed?


LockPickDoor is a function, not a variable. The function return true if it was successful.
I don't need a loop anymore since the function make sure everything is alright.

masterBB

2012-03-19 19:15:25

From: sir eska eau
LockPickDoor is a function, not a variable. The function return true if it was successful.
I don't need a loop anymore since the function make sure everything is alright.


I know it is a function…. I used a @ in front of it, that's the way you pass a function to a function.