Hi, Sorry for a bit delay for reply: have you manage to solve this issue?
I'm not running Windows so it is a bit hard to reproduce exact same behavior (on linux FLTK will run FLTK builtin dialog). The first question is (after I quickly scanned your previous posts) why it take so long to show Windows dialog? Maybe you can try to inject somewhere 'Fl::awake(p)', so app could receive events again... Regards, Sanel On Wed, Jan 30, 2013 at 07:05:59AM -0800, David Lopez wrote: > Sanel, > Thank you for your help but I couldn't solve the problem. > When I try to call start_job () from the dedicated worker thread with the > invocation properly protected, that is: > Fl::lock (); > p->start_job (1); > Fl::unlock (); > > Then start_job () blocks forever at line > if (PrintDlg (&pd) != 0) { > within Fl_System_Printer::start_job (). > Removing the lock /unlock I was able to make it work using your second > strategy but, it works only sometimes, and sometimes the job appear as > "spooling" in the printer queue and the FLTLK app blocks. > May be you or someone else could give me some clue... > Thank you very much > David > > > Two strategies comes to my mind (maybe others with more experience will > > have better ideas): > > > > * put both start_job()/end_job() in different thread, protect them with > > Fl::lock()/Fl::unlock(), and after it gets completed, call > > Fl::awake(NULL) to notify the main thread > > > > * the second one is to put start_job() (with lock/unlock) protection in > > separate thread and when it gets completed, let it call > > Fl::awake(cleanup_cb), where 'cleanup_cb' is your callback (in the main > > thread) with end_job() call; something like: > > > > void cleanup_cb(void *o) { > > Fl_Printer *p = (Fl_Printer*)o; > > p->end_job(); > > } > > > > void* thread_func(void *o) { > > Fl_Printer *p = (Fl_Printer*)o; > > p->start_job(); > > Fl::awake(cleanup_cb, p); > > } > > > > /* rest of the code */ > > > > Sanel > > > > On 01/29/2013 02:10 PM, David Lopez wrote: > > > Thanks, but then what should I do to avoid the blocking? > > > > > >> Have you tried to use locking described at: > > >> http://www.fltk.org/doc-1.3/advanced.html? > > >> > > >> AFAIK, end_job() will access FLTK drawing facility again, which is > > >> probably the cause why you are getting blocked UI again. > > >> > > >> Sanel > > >> > > >> On 01/28/2013 07:51 PM, David Lopez wrote: > > >>> Hi everybody, > > >>> I have a multi-thread FLTK 1.3 application on Win XP. The problem is > > >>> that when the application tries to print (using Fl_Printer) all > > >>> threads get blocked while the Windows printer selection dialog is open. > > >>> In that case the method Fl_Printer::start_job() was called from a > > >>> callback (from main thread). > > >>> So to prevent the application from blocking I decided to create a > > >>> working thread that calls Fl_Printer::start_job() ⦠> > >>> Fl_Printer::end_job(). > > >>> With this change, the application doesnât block itself while the > > >>> dialog is open but blocks forever after printing. > > >>> I suspect that Iâm doing something wrong since I know that no window > > >>> should be open or close from threads other than the main one, but I > > >>> don´t know what would be the right way to implement this. > > >>> Thank you very much. > > >>> David > > >>> > > >> > > > > > > _______________________________________________ fltk mailing list fltk@easysw.com http://lists.easysw.com/mailman/listinfo/fltk