<div dir="ltr">Hi Yili,<div><br></div><div>> <span style="font-family:arial,sans-serif;font-size:13px">will ImageJ2 run its plugin in a new thread?</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br>

</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Yes, ImageJ2 launches plugins in their thread. See:</span></div><div><font face="arial, sans-serif"><a href="http://jenkins.imagej.net/job/ImageJ-daily/javadoc/imagej/module/ModuleService.html#run(imagej.module.ModuleInfo">http://jenkins.imagej.net/job/ImageJ-daily/javadoc/imagej/module/ModuleService.html#run(imagej.module.ModuleInfo</a>, boolean, java.lang.Object...)</font><br>

</div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">ImageJ modules are typically fired using these run methods, which spawn a new thread using the ThreadService -- well, it's out of a ThreadPool, so in theory you could hit a limit if you run tons of modules at the same time.</font></div>

<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Note that the methods return a Future, so that you can block till execution is complete *if you want* but you are not forced to do so.</font></div>

<div><br></div><div><div><div><font face="arial, sans-serif">> </font><span style="font-family:arial,sans-serif;font-size:13px">Suppose this plugin will perform a long time-consumed task</span></div><div><font face="arial, sans-serif"><br>

</font></div><div><font face="arial, sans-serif">If you write a command whose sole job is to perform some long-running task, just implement the task in the run method. You do not have to worry about threading unless you want the execution itself to be done using multiple threads. (In the future we plan to provide more transparent multi-threading, but right now modules execute on a single new thread.)</font></div>

</div></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif"><div>> If this plugin need its own GUI, but this plugin is running in a</div><div>> thread which is not the UI thread (event dispatch thread), and this</div>

<div>> plugin's GUI should be created in UI thread for thread safe, how can</div><div>> this be done?</div><div><br></div></font></div><div><font face="arial, sans-serif">You do not need to create Swing UI component on the EDT. You can do it in any thread. It is only *after* you pack() and setVisible(true) that you need to be concerned about the EDT, and even then, if all you are doing is listening for GUI events (e.g., actionPerformed callbacks) then those already happen on the EDT so you don't need to worry.</font></div>

<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">In short, in 99% of cases, you actually do not need to use EventQueue.invokeLater and similar. So even if you write an ImageJ command that spawns a Swing UI, you may not need this method.</font></div>

<div><br></div><div><font face="arial, sans-serif">As Johannes says, if you want to stay general, look at the ImageJ ThreadService. It has UI-agnostic entry points into concepts like the EDT, without explicitly tying them to AWT/Swing in particular.</font></div>

<div><font face="arial, sans-serif"><br></font></div><div>> In the task running process, I want to report the running progress to</div><div>> the ImageJ2 main frame</div><div><br></div><div><a href="http://jenkins.imagej.net/job/SciJava-common-javadoc/javadoc/org/scijava/app/StatusService.html">http://jenkins.imagej.net/job/SciJava-common-javadoc/javadoc/org/scijava/app/StatusService.html</a><br>

</div><div><br></div><div>The ImageJ UI (be it a Swing one, or other one) will take care of rendering your status messages and progress updates to the status bar or however it sees fit.</div><div><br></div><div>Regards,</div>

<div>Curtis</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 13, 2014 at 8:19 AM, Yili Zhao <span dir="ltr"><<a href="mailto:panovr@gmail.com" target="_blank">panovr@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi,</div><div>  if I want to develop a plugin for ImageJ2, there are basically two kinds of plugin:</div>

<div><br></div><div>  1. first kind plugin does not need GUI;</div><div><br></div><div>  2. second kind plugin does need GUI.</div>
<div><br></div><div>  Suppose this plugin will perform a long time-consumed task, so I want to ask that:</div><div><br></div><div>  1. will ImageJ2 run its plugin in a new thread? Because in Swing toolkit, all UI events should be processed in UI thread or the main thread, and there is only One UI thread, so it is a single thread model.</div>


<div>Running a plugin in a new thread can guarantee the plugin will not block ImageJ2's GUI.</div><div><br></div><div>  2. If this plugin need its own GUI, but this plugin is running in a thread which is not the UI thread (event dispatch thread), and this plugin's GUI should be created in UI thread for thread safe, how can this be done? </div>


<div><br></div><div>  In order to avoid blocking the ImageJ2' user interface, I plan to do like this:</div><div><br></div><div>  1. execute the "long time-consumed task" in a separate worker thread;</div><div>


<br></div><div>  2. In the task running process, I want to report the running progress to the ImageJ2 main frame, so that the main frame can display a progress information to let user know the current status;</div><div><br>


</div><div>  3. When the task completed, it can notify the main frame, and the main frame can response to this event.</div><div><br></div><div>  How can I implement this asynchronous task model in ImageJ2? (I think maybe I need some helper classes like  "SwingWorker" in JDK 6)</div>


<div><br></div><div>  Thanks!</div><span class="HOEnZb"><font color="#888888"><div><br></div><div><br></div>-- <br>Yili Zhao
</font></span></div>
<br>_______________________________________________<br>
ImageJ-devel mailing list<br>
<a href="mailto:ImageJ-devel@imagej.net">ImageJ-devel@imagej.net</a><br>
<a href="http://imagej.net/mailman/listinfo/imagej-devel" target="_blank">http://imagej.net/mailman/listinfo/imagej-devel</a><br>
<br></blockquote></div><br></div>