Re: Interrupting a beanshell script in JConsole
Jean-Philippe Daigle <[email protected]> Tue, 21 Jul 2009 11:07:14 -0400
| Newsgroups | gmane.comp.java.beanshell.user |
|---|---|
| Message-ID | <[email protected]> |
Here we go, in case this can help anyone else. I setup an anonymous
subclass of JConsole that handles ctrl+c, and then always write loops
as "while(!loopexit)". It's a bit of an ugly hack, but it seems to
work for my app:
final String LOOPEXIT =3D "loopexit";
/*
* Loops in bsh scripts should always check the state of
* "loopexit" in order to process Ctrl+C:
*
* while(!loopexit) { ... };
*/
JConsole console =3D new JConsole() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
try {
if (e.getKeyCode() =3D=3D KeyEvent.VK_C
&& ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)) {
// ctrl+c, set loopexit
interpreter.set(LOOPEXIT, true);
} else {
// Any other key: clear loopflag
interpreter.set(LOOPEXIT, false);
}
} catch (EvalError e1) {
e1.printStackTrace();
}
}
};
interpreter =3D new Interpreter(console);
try {
interpreter.set(LOOPEXIT, false);
} catch (EvalError e) {
e.printStackTrace();
}
On Mon, Jul 20, 2009 at 11:23 PM, Jean-Philippe
Daigle<[email protected]> wrote:
> Thanks, David.
> I can't see a clean fix either. I've experimented with subclassing
> JConsole and catching the Ctrl+C keyPressed(), but there's no good way
> to stop the interpreter. A crazy hack I imagined that would handle
> ctrl+c correctly might be:
>
> * Subclass JConsole and provide your own keyPressed(KeyEvent)
> implementation that calls JConsole's, BUT detects ctrl+c and sets some
> global flag to terminate loops.
> * Never ever ever do while(true) in a script, always do while(!flag).
> * Reset flag to false on every keystroke that's NOT a ctrl-C.
>
> Looks ugly, but being mindful of this in scripts (as you suggested)
> seems to be the way to go.
>
>
> On Mon, Jul 20, 2009 at 9:48 PM, David A. Lee<[email protected]> wrote:
>> Same as in java, I know no way to do this.=A0 There is no equivilent to
>> signals in java.
>> The best I can suggest is to "simulate a breakpoint".
>> That is intersperse your loop to a callback into your own code like
>> for( ... ) {
>> =A0=A0 code
>> =A0=A0 if( my_breakpoint_is_set)
>> =A0=A0=A0=A0=A0 throw new MyException("stop here");
>> }
>>
>>
>> David A. Lee
>> [email protected]
>> http://www.calldei.com
>> http://www.xmlsh.org
>> 812-482-5224
>>
>> Jean-Philippe Daigle wrote:
>>
>> On Mon, Jul 20, 2009 at 5:52 PM, David A. Lee <[email protected]> wrote:
>>>
>>> Close the console window ?
>>>
>>> David A. Lee
>>> [email protected] =A0http://www.calldei.com
>>> http://www.xmlsh.org
>>> 812-482-5224
>>>
>>>
>>>
>>> Jean-Philippe Daigle wrote:
>>>>
>>>> Say you're running a loop in a beanshell script, like this:
>>>>
>>>> while(true){ print("uh-oh!"); };
>>>>
>>>> The above will run forever and I haven't found a way to interrupt it.
>>>> I've tried:
>>>> * ctrl+c
>>>> * pause key
>>>> * break key
>>>> * ctrl+break
>>>>
>>>> Is there any way to interrupt a loop running in a JConsole?
>>>>
>>
>> Yes, closing the console works quite well, but I was looking to interrupt
>> the loop without losing the session.
>>
>> An example would be if you have a loop running that prints out statistics
>> every 5 seconds, and you want to interrupt it and use your session some
>> more.
>>
>
---------------------------------------------------------------------------=
---
Enter the BlackBerry Developer Challenge =
This is your chance to win up to $100,000 in prizes! For a limited time, =
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize=
=
details at: http://p.sf.net/sfu/Challenge