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

Reply via email to