On Thu, Jul 8, 2010 at 11:31, Douglas Buchanan <[email protected]> wrote:
> Nate, that sounds promising. What I have now is using events that are posted
> by the worker thread and subscribed to by the progress dialog that is part of
> the main UI thread. I have two lingering issues:
>
> 1) I indicate what document (x of X) that I am processing. Although an event
> is posted for each one, the UI does not update smoothly enough to reflect
> each one. It jumps numbers, although I know the dialog is actually receiving
> and processing each event
> 2) There is a Cancel button on the dialog that responds correctly the first
> time. It asks "Are you sure", and if you hit No the processing continues (it
> is actually still happening in the background worker thread while waiting).
> The issue with this is that once No is clicked, then Cancel button will not
> respond to any future clicks
>
> I had originally looked at the callAfterInterval, but discarded it for some
> reason I cannot remember. What are you using for a synchronization object
> between threads? A Queue?
It's just an object.
class SynchObject(object):
def __init__(self):
self.TotalDocuments = 0
self.CurrentDocument = 0
self.CancelProcess = False
Worker thread's run method:
def run(self):
for document in DocumentsList:
if synchObjectInstance.CancelProcess:
break
# process document
synchObjectInstance.CurrentDocument += 1
UI's methods:
def updateUI(self):
self.currentDocumentLabel.Text = synchObjectInstance.CurrentDocument
if synchObjectInstance.CurrentDocument <
synchObjectInstance.TotalDocuments and not
synchObjectInstance.CancelProcess:
dabo.ui.callAfterInterval(100, self.updateUI)
else:
self.closeDialog()
Hope this gives you an idea. Clicking the cancel button should call
an event that just sets CancelProcess to True. The reason I call the
close dialog method from the updateUI method is that I want to be sure
that the UI update has stopped. In the close dialog method, you also
want to make sure that the worker thread has been released before you
close the dialog.
One more thing. Python's threading libraries can't take advantage of
running simultaneously on multiple processors, so you don't need to
worry about concurrency issues. This is why you can use a simple
object. If you want/need to encapsulate each value in a property you
can, I just used attributes for space and time's sake.
Regards,
Nate
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-users
Searchable Archives: http://leafe.com/archives/search/dabo-users
This message:
http://leafe.com/archives/byMID/[email protected]