Re: Suspending and resuming JNI thread
i, Beaton
Thanku very much for ur reply, even though i not clear .... i am posted
sample code exactly what i am using...
/* Mynative Class***/
class Mynative implements Runnable
{
Thread t;
Mynative()
{ t=new Thread(this); }
public synchronized void run()
{
Cfun();
}
static System.loadLibrary("Clib");
}
/*MyGui Class***/
class GUI extends JDialog implements ActioinListener
{
Mynative mm=new Mynative();
/*Button creation and adding*/
public void actionPerformed(ActionEvent ee)
{
if(ee.getSource()==start)
mm.t.start(); //C execution started fine...
and printing in infinite loop
if(ee.getSource()==pause)
mm.t.suspend(); // no response... still
printing..
if(ee.getSource()==resume)
mm.t.resume(); // no response.. still printing
if(ee.getSource()==stop)
mm.t.stop(); // no response.. still
printing..
}
}
/*Main*/
public class Threadwindow
{
public static void main(String args[]) {
GUI window = new GUI();
window.setTitle("Process_Window");
window.pack();
window.show();
}
}
/*Cfun()----in C file--*/
JNIEXPORT void JNICALL Java_Mynative_Cfun (JNIEnv *env1, jobject
objj)
{
for(;;)
{ printf(" C code :..."); }
}
Please explain me .. how i have to change the code inorder to make
working of suspend, resume and stop with ur code...
Thanking u,
Ganesh
Gordon Beaton wrote:
On 30 Nov 2006 01:45:54 -0800, ganeshamutha@gmail.com wrote:
What my question is .. how can i suspend and resume JNI the thread
Thread methods suspend(), resume() etc are deprecated:
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
At any rate, your native thread cannot be forced to suspend or exit,
it needs to *cooperate* with the controlling thread. The easiest way
is to periodically call a Java method that can wait on a semaphore.
One way is to create a new instance of the following class, to pass to
your native method:
public class Suspender {
private boolean cancelled = false;
private boolean suspended = false;
public synchronized boolean wait_here() {
try {
while (suspended) {
wait();
}
}
catch (InterruptedException e) {
cancelled = true;
}
return cancelled;
}
public synchronized void suspend() {
suspended = true;
}
public synchronized void resume() {
suspended = false;
notify();
}
public synchronized void cancel() {
cancelled = true;
resume();
}
}
From the native method, periodically call wait_here(). If the
controlling thread calls suspend(), the native thread will block in
the next call to wait_here(). When the controlling thread calls
resume(), the native thread will continue.
If the controlling thread calls cancel(), wait_here() will return
true, signalling the native method to return.
/gordon
--
[ don't email me support questions or followups ]
g o r d o n + n e w s @ b a l d e r 1 3 . s e