Progress update and action cancel architecture
Boudewijn Rempt
boud at valdyas.org
Tue Dec 27 21:56:29 CET 2005
Currently, Krita handles progress updates & cancelling of long actions through
a signals and slots. There's also quite a bit of close coupling, with the
progress subject registering itself with the progress display label.
This gives problems with threading: if I start four threads and they all want
to update the progress label, we're in for a rude shock. The progress label
is broken anyway because it uses processEvents(), which guarantees crashes,
especially if users are scaling in one view and trying to work in another.
I'm groping for an architecture that will work here and that will give us a
clean path towards locking just one view instead of all views when a
long-running process runs.
I've got some ideas, but as you can see, there's one problem that I'm not sure
how to solve (except by rewriting Krita to never act directly on input, but
add every command the user gives to a queue that is emptied as soon as
possible):
pseudo-code ahead alert:
KisThread : QThread {
// Canceled value is read by the subclass
void cancel() { m_canceled = true; }
boolean isCanceled();
private:
bool m_canceled;
}
LengthyThreads : KisThread
{
void run() {
while (!isCanceled()) {
doStuff();
qApp::postEvent(KisProgressInterface, new UpdateEvent(percentDone));
}
}
}
KisSomeClass : KisProgressSubject {
void lengthyOp(KisProgressInterface kpi ) {
kpi.initialize("LengthyOp", this, MAX_THREADS);
for (int i = 0; i < MAX_THREADS; ++i) {
KisThread t = new LengthyThread();
t.start();
m_treads.append(t);
}
// This is the tricky bit: if we wait for all threads, the events are never
// sent or processed, because we're blocking the gui thread by waiting for
// the worker thread. We want to block on all user input, except for the
// cancel button, or, ideally, find a way to store new commands for this
// in a queue and handle them later.
}
void cancel() {
for all threads in m_threads: thread->cancel();
}
}
--
Boudewijn Rempt
http://www.valdyas.org/fading/index.cgi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.kde.org/pipermail/kimageshop/attachments/20051227/79af3d6a/attachment.pgp
More information about the kimageshop
mailing list