Are you sure code from first way will work? I thought
QApplication.invokeLater was made to submit UI changes into Qt UI
event loop... I may be wrong though.

It depends on what for do you need it. Of course first is closer to
perfect if you're ready to support that code. Did you looked at
SwingWorker in JDK6? It is using similar approach, creating
"accumulative runnalbe" and submitting it from time to time into event
dispatcher. It is better because your task is not paused by UI update
operation and your UI is not paused by executing task.

On Wed, Sep 30, 2009 at 1:13 PM, Dusan Zatkovsky <[email protected]> wrote:
> Hi all.
>
> I have a question about how to show some task progress. Here is my story:
>
> I needed to create a "task", that runs a long-time job ( simulated by cycle 
> over sleep()s in example code ) and shows the progress.
>
> I have tried 2 ways to do this, but none is the best. I'll be happy if 
> someone tell me the right way.
>
>
> Create primitive dialog with progressbar and slider. It will be used in 
> following cases:
>
>        QDialog d = new QDialog();
>        QLayout l = new QFormLayout(d);
>        QProgressBar b = new QProgressBar();
>        l.addWidget(b);
>        QSlider s = new QSlider();
>        l.addWidget(s);
>
>
>
> Way 1 - job in thread:
> ----------------------
>
>        // show dialog
>        d.show();
>
>        // this is my job. It emits sigProgressChanged(). Every step it sleeps 
> for
>        // 2 seconds to simulate a long-time job.
>        class Job extends QSignalEmitter implements Runnable {
>            public Signal1<Integer> sigProgressChanged = new 
> Signal1<Integer>();
>            public void run() {
>                for ( int i = 0; i < 30; i++ ) {
>
>                    // do work
>                    Thread.sleep(2000);
>
>                    // emit progress
>                    sigProgressChanged.emit(i);
>
>                    // show message - this will crash the app, because out of 
> main loop
>                    QMessageBox.info(...)
>                }
>            }
>
>        }
>
>        // create, connect and start the job in separate thread
>        Job j = new Job();
>        j.sigProgressChanged.connect(b, "setValue(int)");
>        QThread t = new QThread(j);
>        t.start();
>
>        // dialog will be exec()uted, so main loop will not be broken
>        d.exec();
>        t.join();
>
>        advantages:
>                -       gui is working smoothly
>
>        disadvantages:
>                -       too much of code. Nested class, threading, ...
>                -       too many signals (at least 2 - progress changed and 
> job done, because executed dialog must be closed
>                        when job has finished. Number of signals is growing if 
> you have another special needs ).
>                -       I can't do anything with gui from within the thread ( 
> show the error messages etc... ).
>                        It throws exceptions about out-of-main-loop and app 
> (probably) crashes.
>
>
> Way 2 - calling processEvents():
> ----------------------
>
>        // only show, do not exec the dialog
>        d.show();
>
>        // job loop
>        for ( int i = 0; i < 30; i++ ) {
>
>            // simulate work
>            Thread.sleep(2000);
>
>            // set progress
>            b.setValue(i);
>
>            // process events
>            QApplication.processEvents();
>
>            // show message - no problem here
>            QMessageBox.info(...)
>        }
>
>
>        advantages:
>                -       I can show the message and do anything with gui
>                -       simple and clear code without "magic" (and for non-qt 
> programmer hidden) signals
>
>        disadvantages:
>                -       gui is freezing, because it is updated in 2s steps
>
>
>
> I think right solution is somewhere between those ways, but I can't find it.
>
> Anybody helps?
>
> Thank you
>
> --
> Dusan
> _______________________________________________
> Qt-jambi-interest mailing list
> [email protected]
> http://lists.trolltech.com/mailman/listinfo/qt-jambi-interest
>



-- 
Heresylabs code: http://heresylabs.googlecode.com/
Heresylabs blog: http://heresylabs.org/

_______________________________________________
Qt-jambi-interest mailing list
[email protected]
http://lists.trolltech.com/mailman/listinfo/qt-jambi-interest

Reply via email to