Thread blocking GUI

outside to free GUI events. All the processing memory is held till wx.CallAfter is reached.

Thats the effect I have when I comment-out the recieve function on my right panel

class MyThread(threading.Thread):
def init(self, DirQ, new_dbfQ, RemoveQ):
threading.Thread.init(self)
self.setDaemon(True)
self.DirQ = DirQ
self.new_dbfQ = new_dbfQ
self.RemoveQ = RemoveQ
self.start()

def run(self):
“”" worker “”"
self.OpenDir = self.DirQ.get()
self.new_dbf = self.new_dbfQ.get()
self.RegRemove = self.RemoveQ.get()

    with open(str(self.OpenDir), 'r') as infile:
        reader = csv.reader(infile)
        data = StringIO()

writer = csv.writer(data)
for line in csv.reader(self.new_dbf.splitlines()):
row = line
row_edit = re.sub(self.RegRemove,’’, row[1])
writer.writerow([row[0], row_edit])
msg = data.getvalue()

print msg

            wx.CallAfter(Publisher().sendMessage, "update", msg)

########## Right Panel ###########

def _update(self, msg):
pass

msg = msg.data

dispatcher.send(“FOO CHANGED”, message=msg)

If I take the comments out. All of my frames - (Not Responding)

What am I not figuring out here?

···

From my understanding, the basics of threading is to set your long running task

George McCown wrote:

From my understanding, the basics of threading is to set your long
running task
outside to free GUI events. All the processing memory is held till
wx.CallAfter is reached.

Well, I think you have the sense of it, although your sentences are a
bit confused there. If you need to execute a long-running task in a
GUI, then you can use threading to do it, leaving the GUI free to handle
events. You then have to use wx.CallAfter if you need to update the GUI
in that processing.

Thats the effect I have when I comment-out the recieve function on my
right panel

Your code is missing an awful lot of things to make it comprehensible.
What are DirQ, new_dbgQ, and RemoveQ? From the names I assume they are
queues of some kind. It's not particularly good practice to have three
different queues if they are all required for some task. You can get
into some ugly race conditions. You might consider just creating a
tuple with the three objects you need, and adding the tuple a single
"work queue".

What's "Publisher()"? What's "dispatcher"? Are you getting into the
_update method? Are you waiting for some result somewhere?

In something this involved, we'd probably have to see an entire runnable
example.

···

--
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.

What’s “Publisher()”? What’s “dispatcher”?

I’m using 2 different sender and recieve methods. I have some issues with Publisher not relating to this subject.

Are you getting into the_update method?

Yes

In something this involved, we’d probably have to see an entire runnable
example.

ok. I will attach a 2 column dbf database also. Note: if you try to open a 2 column dbf db with over 2000 rows, the processing bogs down.

I’m working on that issue too.

splitter_version_build_10_new_thread.py (48.1 KB)

1014.dbf (60.5 KB)

···

On Tuesday, February 25, 2014 3:19:20 PM UTC-6, Tim Roberts wrote:

George McCown wrote:

From my understanding, the basics of threading is to set your long

running task

outside to free GUI events. All the processing memory is held till

wx.CallAfter is reached.

Well, I think you have the sense of it, although your sentences are a

bit confused there. If you need to execute a long-running task in a

GUI, then you can use threading to do it, leaving the GUI free to handle

events. You then have to use wx.CallAfter if you need to update the GUI

in that processing.

Thats the effect I have when I comment-out the recieve function on my

right panel

Your code is missing an awful lot of things to make it comprehensible.
What are DirQ, new_dbgQ, and RemoveQ? From the names I assume they are

queues of some kind. It’s not particularly good practice to have three

different queues if they are all required for some task. You can get

into some ugly race conditions. You might consider just creating a

tuple with the three objects you need, and adding the tuple a single

“work queue”.

What’s “Publisher()”? What’s “dispatcher”? Are you getting into the

_update method? Are you waiting for some result somewhere?

In something this involved, we’d probably have to see an entire runnable

example.


Tim Roberts, ti...@probo.com

Providenza & Boekelheide, Inc.

George McCown wrote:

ok. I will attach a 2 column dbf database also. Note: if you try to
open a 2 column dbf db with over 2000 rows, the processing bogs down.

I'm sorry, this is way to long and entangled for any of us to look at,
and you depend on numerous third-party packages (pydispatch, dbfpy,
xlwt, dbf). In addition, you have THREE different messaging systems in
here (wx window messages, dispatcher signals, and Publisher
subscriptions), and I'm not going to take a guess at how they all
interact. I would not be at all surprised to learn that's where your
difficulty lies. You don't need both PyDispatcher and pubsub.

On an entirely separate note, this entire sequence, which occurs twice
for inexplicable reasons, can be replaced with 5 lines:
            for key, data in items:
                self.idx = self.lc.InsertStringItem(sys.maxint, data[0])
                self.lc.SetStringItem(self.idx, 1, data[1])
                if len(data) == 3:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                if len(data) == 4:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3, data[3])
                if len(data) == 5:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                if len(data) == 6:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                if len(data) == 7:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                if len(data) == 8:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                if len(data) == 9:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                if len(data) == 10:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                if len(data) == 11:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                    self.lc.SetStringItem(self.idx, 10, data[10])
                if len(data) == 12:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                    self.lc.SetStringItem(self.idx, 10, data[10])
                    self.lc.SetStringItem(self.idx, 11, data[11])
                if len(data) == 13:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                    self.lc.SetStringItem(self.idx, 10, data[10])
                    self.lc.SetStringItem(self.idx, 11, data[11])
                    self.lc.SetStringItem(self.idx, 12, data[12])
                if len(data) == 14:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                    self.lc.SetStringItem(self.idx, 10, data[10])
                    self.lc.SetStringItem(self.idx, 11, data[11])
                    self.lc.SetStringItem(self.idx, 12, data[12])
                    self.lc.SetStringItem(self.idx, 13, data[13])
                if len(data) == 15:
                    self.lc.SetStringItem(self.idx, 2, data[2])
                    self.lc.SetStringItem(self.idx, 3,
data[3])
                    self.lc.SetStringItem(self.idx, 4, data[4])
                    self.lc.SetStringItem(self.idx, 5, data[5])
                    self.lc.SetStringItem(self.idx, 6, data[6])
                    self.lc.SetStringItem(self.idx, 7, data[7])
                    self.lc.SetStringItem(self.idx, 8, data[8])
                    self.lc.SetStringItem(self.idx, 9, data[9])
                    self.lc.SetStringItem(self.idx, 10, data[10])
                    self.lc.SetStringItem(self.idx, 11, data[11])
                    self.lc.SetStringItem(self.idx, 12, data[12])
                    self.lc.SetStringItem(self.idx, 13, data[13])
                    self.lc.SetStringItem(self.idx, 14,
data[14])

That can be replaced by this:

            for key, data in items:
                idx = self.lc.InsertStringItem(sys.maxint, data[0])
                for i, item in enumerate(data[1:]):
                  self.lc.SetStringItem(idx, i+1, item)
                self.lc.SetItemData(idx, key)

···

--
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.

You gave me a running start. Truple the queue and implement a single messaging method. Some of these codes are from your previous help. I appreciate that.

···

On Tuesday, February 25, 2014 7:35:16 PM UTC-6, Tim Roberts wrote:

George McCown wrote:

ok. I will attach a 2 column dbf database also. Note: if you try to

open a 2 column dbf db with over 2000 rows, the processing bogs down.

I’m sorry, this is way to long and entangled for any of us to look at,

and you depend on numerous third-party packages (pydispatch, dbfpy,

xlwt, dbf). In addition, you have THREE different messaging systems in

here (wx window messages, dispatcher signals, and Publisher

subscriptions), and I’m not going to take a guess at how they all

interact. I would not be at all surprised to learn that’s where your

difficulty lies. You don’t need both PyDispatcher and pubsub.

On an entirely separate note, this entire sequence, which occurs twice

for inexplicable reasons, can be replaced with 5 lines:

        for key, data in items:

            self.idx = self.lc.InsertStringItem(sys.maxint, data[0])

            self.lc.SetStringItem(self.idx, 1, data[1])          
            if len(data) == 3:              
                self.lc.SetStringItem(self.idx, 2, data[2])

            if len(data) == 4:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3, data[3])

            if len(data) == 5:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

            if len(data) == 6:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

            if len(data) == 7:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

            if len(data) == 8:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

            if len(data) == 9:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

            if len(data) == 10:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

            if len(data) == 11:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

                self.lc.SetStringItem(self.idx, 10, data[10])

            if len(data) == 12:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

                self.lc.SetStringItem(self.idx, 10, data[10])

                self.lc.SetStringItem(self.idx, 11, data[11])

            if len(data) == 13:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

                self.lc.SetStringItem(self.idx, 10, data[10])

                self.lc.SetStringItem(self.idx, 11, data[11])

                self.lc.SetStringItem(self.idx, 12, data[12])

            if len(data) == 14:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

                self.lc.SetStringItem(self.idx, 10, data[10])

                self.lc.SetStringItem(self.idx, 11, data[11])

                self.lc.SetStringItem(self.idx, 12, data[12])

                self.lc.SetStringItem(self.idx, 13, data[13])

            if len(data) == 15:

                self.lc.SetStringItem(self.idx, 2, data[2])

                self.lc.SetStringItem(self.idx, 3,

data[3])
self.lc.SetStringItem(self.idx, 4, data[4])

                self.lc.SetStringItem(self.idx, 5, data[5])

                self.lc.SetStringItem(self.idx, 6, data[6])

                self.lc.SetStringItem(self.idx, 7, data[7])

                self.lc.SetStringItem(self.idx, 8, data[8])

                self.lc.SetStringItem(self.idx, 9, data[9])

                self.lc.SetStringItem(self.idx, 10, data[10])

                self.lc.SetStringItem(self.idx, 11, data[11])

                self.lc.SetStringItem(self.idx, 12, data[12])

                self.lc.SetStringItem(self.idx, 13, data[13])

                self.lc.SetStringItem(self.idx, 14,

data[14])

That can be replaced by this:

        for key, data in items:

            idx = self.lc.InsertStringItem(sys.maxint, data[0])

            for i, item in enumerate(data[1:]):

              self.lc.SetStringItem(idx, i+1, item)

            self.lc.SetItemData(idx, key)


Tim Roberts, ti...@probo.com

Providenza & Boekelheide, Inc.

I solved my GUI blocking. I re-visited: http://wiki.wxpython.org/LongRunningTasks
under THE Easiest Implementation Ever :-)))
Threading by this simple example under my parent panel did the trick. Running
a thread outside the parent and using messaging methods (wx.CallAfter) caused mayhem.