Help !!!

Hi All,

I'm using wxpython to run hardware tests. the gui has a splitter window which the right pane is used for stdout/stderr, the left is the list of test.

when i run on the list of tests, i use functions imported from other file.

the problem is that when i start to run the test (in a loop until the last test), the GUI gets stuck, and at some point it looks as if the same test runs over and over again in undefinite loop !!!

the part of the code that handles the loop is attached, the rest of the functions do not use wxpython, but they use our own DLL.

i tried wx.SafeYield() and self.Update to refresh etc

def OnRunClick(self, event):
        dialog = GeneralParametersDialog()
        result = dialog.ShowModal()
        Num_Of_Tests = self.MidPanel.list.GetItemCount()

        for index in range(Num_Of_Tests):
            self.MidPanel.list.SetItemBackgroundColour(index,'yellow')
            TestName = self.MidPanel.list.GetItemText(index)
            TestType = dictionary_data.dict[TestName][0]

            if TestType is 'dch':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch ' + dch + ' results', 0, -99, 0)
                TestResult=All_Tests.run_on_dch(test_param,[str(dch)])

            elif TestType is 'fach':
                SlotFormat = dictionary_data.dict[TestName][1]
                test_param = test_param = All_Tests.set_test_param('fach ' + SlotFormat + ' results', 0, -99, 0)
                TestResult=All_Tests.Run_on_FACH_RACH(test_param,[int(SlotFormat)])

            elif TestType is 'sho':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch_sho ' + dch + ' results', 0, -99, 0)
                TestResult=All_Tests.run_on_dch(test_param,[str(dch)])

            elif TestType is 'cm':
                CmMethod = dictionary_data.dict[TestName][1]
                Pattern = dictionary_data.dict[TestName][2]
                MaxNumOfPatterns = dictionary_data.dict[TestName][3]
                test_param = All_Tests.set_test_param('cm ' + Pattern + ' results', 0, -99, 0)
                TestResult=All_Tests.run_on_cm(test_param,[Pattern, MaxNumOfPatterns])

            if TestResult is 'pass':
                self.MidPanel.list.SetItemBackgroundColour(index,'green')
            else:
                self.MidPanel.list.SetItemBackgroundColour(index,'red')
            self.RightPanel.log.clear()

Thanks in advance,
Roy.

···

_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE! http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/

The GUI won't update while you are not calling wx.Yield() or
wx.SafeYield() in your code. Let us say, for example, that your test
function was defined and called like the following...

def test_fcn():
    time.sleep(10)

...
    def OnRunClick(self, event):
        for i in xrange(10):
            test_fcn()
            wx.Yield()

Then every 10 seconds the GUI will update, but nothing will happen when
time.sleep(10) is waiting 10 seconds.

Want my suggestion? Use wx.lib.delayedresult. Below is an updating of
your method to use delayedresult in wxPython 2.7 . If you want to stop
the testing early, use del obj.tests[:], and it will stop testing when
it is done with the most recent test. Also, don't use 'is' for string
comparison. It only works here because Python (generally speaking)
interns all strings that could be variable names, but generally you want
the == semantics for string comparison.

- Josiah

import wx.lib.delayedresult as dr

...
    def __init__(...):
        ...
        
        self.tests =
        self.running = 0
        
        ...
    
    def OnRunClick(self, event):
        if self.running:
            return
        
        dialog = GeneralParametersDialog()
        result = dialog.ShowModal()
        
        tests = self.tests
        
        smpl = self.MidPanel.list
        
        Num_Of_Tests = smpl.GetItemCount()

        for index in range(Num_Of_Tests):
            smpl.SetItemBackgroundColour(index,'yellow')
            TestName = smpl.GetItemText(index)
            TestType = dictionary_data.dict[TestName][0]

            if TestType is 'dch':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch ' + dch + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))

            elif TestType is 'fach':
                SlotFormat = dictionary_data.dict[TestName][1]
                test_param = test_param = All_Tests.set_test_param('fach ' + SlotFormat + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.Run_on_FACH_RACH, (test_param, [int(SlotFormat)])))

            elif TestType is 'sho':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch_sho ' + dch + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))

            elif TestType is 'cm':
                CmMethod = dictionary_data.dict[TestName][1]
                Pattern = dictionary_data.dict[TestName][2]
                MaxNumOfPatterns = dictionary_data.dict[TestName][3]
                test_param = All_Tests.set_test_param('cm ' + Pattern + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_cm, (test_param, [Pattern, MaxNumOfPatterns])))
        
        self.running = 1
        self.OnRunResult(None, None)
    
    def OnRunResult(self, TestResult, index):
        if index is not None:
            if TestResult == 'pass':
                self.MidPanel.list.SetItemBackgroundColour(index,'green')
            else:
                self.MidPanel.list.SetItemBackgroundColour(index,'red')
        self.RightPanel.log.clear()
        if self.tests:
            index, testfcn, args = self.tests.pop(0)
            dr.startWorker(self.OnRunResult, testfcn, cargs=(index,), wargs=args)
        else:
            self.running = 0

···

"ROY ZINN" <royzinn@hotmail.com> wrote:

Hi All,

I'm using wxpython to run hardware tests. the gui has a splitter window
which the right pane is used for stdout/stderr, the left is the list of
test.

when i run on the list of tests, i use functions imported from other file.

the problem is that when i start to run the test (in a loop until the last
test), the GUI gets stuck, and at some point it looks as if the same test
runs over and over again in undefinite loop !!!

the part of the code that handles the loop is attached, the rest of the
functions do not use wxpython, but they use our own DLL.

i tried wx.SafeYield() and self.Update to refresh etc

This little tidbit comes in handy and works better than yeild(ing) when
you keep the gui thread's attention.

while wx.GetApp().Pending()
  wx.GetApp().Dispatch()

It is advisable that a separate thread be used for processing extended
loops/etc. But that's a bigger ball of wax, ie. messaging between
threads for progress status, etc.

-Joseph

···

On Sun, 2006-10-29 at 11:26 -0700, Josiah Carlson wrote:

"ROY ZINN" <royzinn@hotmail.com> wrote:
>
> Hi All,
>
> I'm using wxpython to run hardware tests. the gui has a splitter window
> which the right pane is used for stdout/stderr, the left is the list of
> test.
>
> when i run on the list of tests, i use functions imported from other file.
>
> the problem is that when i start to run the test (in a loop until the last
> test), the GUI gets stuck, and at some point it looks as if the same test
> runs over and over again in undefinite loop !!!
>
> the part of the code that handles the loop is attached, the rest of the
> functions do not use wxpython, but they use our own DLL.
>
> i tried wx.SafeYield() and self.Update to refresh etc

The GUI won't update while you are not calling wx.Yield() or
wx.SafeYield() in your code. Let us say, for example, that your test
function was defined and called like the following...

def test_fcn():
    time.sleep(10)

...
    def OnRunClick(self, event):
        for i in xrange(10):
            test_fcn()
            wx.Yield()

Then every 10 seconds the GUI will update, but nothing will happen when
time.sleep(10) is waiting 10 seconds.

Want my suggestion? Use wx.lib.delayedresult. Below is an updating of
your method to use delayedresult in wxPython 2.7 . If you want to stop
the testing early, use del obj.tests[:], and it will stop testing when
it is done with the most recent test. Also, don't use 'is' for string
comparison. It only works here because Python (generally speaking)
interns all strings that could be variable names, but generally you want
the == semantics for string comparison.

- Josiah

import wx.lib.delayedresult as dr

...
    def __init__(...):
        ...
        
        self.tests =
        self.running = 0
        
        ...
    
    def OnRunClick(self, event):
        if self.running:
            return
        
        dialog = GeneralParametersDialog()
        result = dialog.ShowModal()
        
        tests = self.tests
        
        smpl = self.MidPanel.list
        
        Num_Of_Tests = smpl.GetItemCount()

        for index in range(Num_Of_Tests):
            smpl.SetItemBackgroundColour(index,'yellow')
            TestName = smpl.GetItemText(index)
            TestType = dictionary_data.dict[TestName][0]

            if TestType is 'dch':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch ' + dch + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))

            elif TestType is 'fach':
                SlotFormat = dictionary_data.dict[TestName][1]
                test_param = test_param = All_Tests.set_test_param('fach ' + SlotFormat + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.Run_on_FACH_RACH, (test_param, [int(SlotFormat)])))

            elif TestType is 'sho':
                dch = dictionary_data.dict[TestName][1]
                test_param = All_Tests.set_test_param('dch_sho ' + dch + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))

            elif TestType is 'cm':
                CmMethod = dictionary_data.dict[TestName][1]
                Pattern = dictionary_data.dict[TestName][2]
                MaxNumOfPatterns = dictionary_data.dict[TestName][3]
                test_param = All_Tests.set_test_param('cm ' + Pattern + ' results', 0, -99, 0)
                
                tests.append((index, All_Tests.run_on_cm, (test_param, [Pattern, MaxNumOfPatterns])))
        
        self.running = 1
        self.OnRunResult(None, None)
    
    def OnRunResult(self, TestResult, index):
        if index is not None:
            if TestResult == 'pass':
                self.MidPanel.list.SetItemBackgroundColour(index,'green')
            else:
                self.MidPanel.list.SetItemBackgroundColour(index,'red')
        self.RightPanel.log.clear()
        if self.tests:
            index, testfcn, args = self.tests.pop(0)
            dr.startWorker(self.OnRunResult, testfcn, cargs=(index,), wargs=args)
        else:
            self.running = 0

---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwidgets.org
For additional commands, e-mail: wxPython-users-help@lists.wxwidgets.org

This little tidbit comes in handy and works better than yeild(ing) when
you keep the gui thread's attention.

while wx.GetApp().Pending()
  wx.GetApp().Dispatch()

That is a useful little pattern to have on hand, but it requires that
either your non-GUI modules be written with the wx event loop in mind,
something that not everyone remembers to do, wants to do, or can do
after the fact.

It is advisable that a separate thread be used for processing extended
loops/etc. But that's a bigger ball of wax, ie. messaging between
threads for progress status, etc.

As I have just shown, it's not that bad.

- Josiah

···

Joe Brown <joebrown@podiatryfl.com> wrote:

On Sun, 2006-10-29 at 11:26 -0700, Josiah Carlson wrote:
> "ROY ZINN" <royzinn@hotmail.com> wrote:
> >
> > Hi All,
> >
> > I'm using wxpython to run hardware tests. the gui has a splitter window
> > which the right pane is used for stdout/stderr, the left is the list of
> > test.
> >
> > when i run on the list of tests, i use functions imported from other file.
> >
> > the problem is that when i start to run the test (in a loop until the last
> > test), the GUI gets stuck, and at some point it looks as if the same test
> > runs over and over again in undefinite loop !!!
> >
> > the part of the code that handles the loop is attached, the rest of the
> > functions do not use wxpython, but they use our own DLL.
> >
> > i tried wx.SafeYield() and self.Update to refresh etc
>
> The GUI won't update while you are not calling wx.Yield() or
> wx.SafeYield() in your code. Let us say, for example, that your test
> function was defined and called like the following...
>
> def test_fcn():
> time.sleep(10)
>
> ...
> def OnRunClick(self, event):
> for i in xrange(10):
> test_fcn()
> wx.Yield()
>
> Then every 10 seconds the GUI will update, but nothing will happen when
> time.sleep(10) is waiting 10 seconds.
>
>
> Want my suggestion? Use wx.lib.delayedresult. Below is an updating of
> your method to use delayedresult in wxPython 2.7 . If you want to stop
> the testing early, use del obj.tests[:], and it will stop testing when
> it is done with the most recent test. Also, don't use 'is' for string
> comparison. It only works here because Python (generally speaking)
> interns all strings that could be variable names, but generally you want
> the == semantics for string comparison.
>
> - Josiah
>
>
> import wx.lib.delayedresult as dr
>
> ...
> def __init__(...):
> ...
>
> self.tests =
> self.running = 0
>
> ...
>
> def OnRunClick(self, event):
> if self.running:
> return
>
> dialog = GeneralParametersDialog()
> result = dialog.ShowModal()
>
> tests = self.tests
>
> smpl = self.MidPanel.list
>
> Num_Of_Tests = smpl.GetItemCount()
>
> for index in range(Num_Of_Tests):
> smpl.SetItemBackgroundColour(index,'yellow')
> TestName = smpl.GetItemText(index)
> TestType = dictionary_data.dict[TestName][0]
>
> if TestType is 'dch':
> dch = dictionary_data.dict[TestName][1]
> test_param = All_Tests.set_test_param('dch ' + dch + ' results', 0, -99, 0)
>
> tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))
>
> elif TestType is 'fach':
> SlotFormat = dictionary_data.dict[TestName][1]
> test_param = test_param = All_Tests.set_test_param('fach ' + SlotFormat + ' results', 0, -99, 0)
>
> tests.append((index, All_Tests.Run_on_FACH_RACH, (test_param, [int(SlotFormat)])))
>
> elif TestType is 'sho':
> dch = dictionary_data.dict[TestName][1]
> test_param = All_Tests.set_test_param('dch_sho ' + dch + ' results', 0, -99, 0)
>
> tests.append((index, All_Tests.run_on_dch, (test_param, [str(dch)])))
>
> elif TestType is 'cm':
> CmMethod = dictionary_data.dict[TestName][1]
> Pattern = dictionary_data.dict[TestName][2]
> MaxNumOfPatterns = dictionary_data.dict[TestName][3]
> test_param = All_Tests.set_test_param('cm ' + Pattern + ' results', 0, -99, 0)
>
> tests.append((index, All_Tests.run_on_cm, (test_param, [Pattern, MaxNumOfPatterns])))
>
> self.running = 1
> self.OnRunResult(None, None)
>
> def OnRunResult(self, TestResult, index):
> if index is not None:
> if TestResult == 'pass':
> self.MidPanel.list.SetItemBackgroundColour(index,'green')
> else:
> self.MidPanel.list.SetItemBackgroundColour(index,'red')
> self.RightPanel.log.clear()
> if self.tests:
> index, testfcn, args = self.tests.pop(0)
> dr.startWorker(self.OnRunResult, testfcn, cargs=(index,), wargs=args)
> else:
> self.running = 0
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwidgets.org
> For additional commands, e-mail: wxPython-users-help@lists.wxwidgets.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwidgets.org
For additional commands, e-mail: wxPython-users-help@lists.wxwidgets.org