[AG-TECH] Shared app Gotchas

Jennifer Teig von Hoffman jtvh at bu.edu
Wed Jun 23 12:54:43 CDT 2004


Cool!

I'm adding a link to that page to my "developers link" page in the revised version of the users' guide to 2.2 shared apps.

- Jennifer

Rob King wrote:

> 	Thank you very much!
> 
> 	That cleared things right up!
> 
> 	Since I seem to be running into all the problems I can, I've started
> a page on the Access Grid Wiki devoted to shared app 'gotchas'.  I'll try to
> put up situations that I encounter that have been hard to debug and might be
> common there.  It would be great if any other shared app developers out
> there could put up some of their experiences too
> 
> 	The page is at:
> 
> 	
> http://www-unix.mcs.anl.gov/fl/research/accessgrid/wiki/moin.cgi/SharedAppGo
> tchas?action=show
> 
> 	Hopefully we can grow this, and make life easier for those who come
> after us.
> 
> 	Cheers,
> 
> 	Rob King
> 
> 
> -----Original Message-----
> From: owner-ag-tech at mcs.anl.gov [mailto:owner-ag-tech at mcs.anl.gov] On Behalf
> Of Susanne Lefvert
> Sent: June 22, 2004 5:54 PM
> To: Rob King
> Cc: ag-tech at mcs.anl.gov
> Subject: ***SPAM*** Re: [AG-TECH] Shared app callback problem
> 
> 
> Rob,
> 
> You seem to have a newer version of wxPython installed so I have not 
> actually tried running the code. However, when calling ui components 
> outside of the main ui thread (as you do from your ag event callback) you 
> should use wxPostEvent or wxCallAfter to make sure things are working 
> properly. You can find a good example of wxPostEvent here: 
> http://wiki.wxpython.org/index.cgi/LongRunningTasks. I have been 
> using wxCallAfter so examples of that are in existing shared apps. 
> 
> Regards,
>  
> Susanne
>  
> 
> On Tue, 22 Jun 2004, Rob King wrote:
> 
> 
>>	Thanks again Susanne,
>>
>>	After looking at the shared question tool code it made much more
>>sense.  I finally got the console apps up and running and it has been a
>>great help in debugging so far.
>>	 I've finally narrowed down the problem I've been having.  It would
>>seem as though there is some problem with creating an instance of a
> 
> wxPython
> 
>>widget from within a shared app event call-back.  Even when using the same
>>code for object creation, when instantiated from within a call-back the
>>object locks up (even though traces in the __init__ seem to indicate it
>>initializes fine).  I think it might be some sort of funky threading
>>conflict between AGTK, and wxPython...
>>
>>	Below I have included the code of a really small shared app that
>>exhibits this behaviour.  To try it, simply paste the code into a .py
> 
> file,
> 
>>replace appUrl with an application session (though I'll keep the current
> 
> one
> 
>>up, so it *should* work as is), and run it from the command line.
>>	If running one instance, pressing the new note button should pop up
>>a yellow tooltip that can be moved with the mouse.  To see the problem run
>>two instances (on the same or different computers...shouldn't matter).
>>Pressing the new note button will work as it should in the app where the
>>button was pressed.  A yellow tooltip will also pop up on the receiving
> 
> end,
> 
>>but the widget will lock up, so when mousing over you get an hour glass,
> 
> and
> 
>>you cannot move the tooltip anymore.
>>
>>	Hopefully someone will be able to help me figure this one out, as
>>this same problem has been plaguing me over the past month+.  
>>
>>	Thanks in advance!
>>
>>	-rob king
>>	
>>
>>
>>
>>###########################Start code##################################
>>
>>
>>from wxPython.wx import *
>>import AccessGrid.SharedAppClient
>>from AccessGrid.Toolkit import CmdlineApplication
>>
>>class StickyBoard(wxApp):
>>    def __init__( self, appUrl, debugMode = 1, logFile = None):
>>        self.appURL = appUrl
>>        
>>
>>        # Create shared application client
>>        self.sharedAppClient =
>>AccessGrid.SharedAppClient.SharedAppClient("StickyBoard")
>>        self.log = self.sharedAppClient.InitLogging(debugMode, logFile)
>>
>>        self.app = CmdlineApplication.instance()
>>        self.app.Initialize("Sticky Board")
>>
>>        # Connect to shared application service.
>>        self.sharedAppClient.Join(appUrl)
>>
>>        wxApp.__init__(self, False)
>>
>>
>>    def OnInit(self):
>>        self.Control = StickyBoardControl(self)
>>        self.SetTopWindow(self.Control)
>>        self.Control.Show(1)
>>        self.sharedAppClient.RegisterEventCallback("note",
>>self.Control.noteCB )
>>        return 1
>>
>>
>>
>>class StickyBoardControl(wxFrame):
>>    def __init__(self, parent):
>>        kwds =
>>
> 
> {"style":wxCAPTION|wxMINIMIZE_BOX|wxCLOSE_BOX|wxSYSTEM_MENU|wxRESIZE_BORDER,
> 
>>"size":(120, 120), "pos":(0,0)}
>>
>>        wxFrame.__init__(self, *(None, -1, ""), **kwds)
>>
>>        self.parent = parent
>>        self.notes = []
>>
>>        self.button = wxButton(self, -1, "New Note")
>>        self.Bind(EVT_BUTTON, self.newSticky, self.button)
>>
>>        box = wxBoxSizer(wxVERTICAL)
>>        box.Add((0, 0))
>>        box.Add(self.button, 0, wxALIGN_CENTER|wxALL, 15)
>>        self.SetAutoLayout(True)
>>        self.SetSizer(box)
>>
>>    def noteCB(self, event):
>>        senderId = event.data
>>        if senderId == self.parent.sharedAppClient.GetPublicId():
>>            self.parent.log.debug("Ignoring edit message from myself ")
>>        else:
>>            self.parent.log.debug( "adding note" )
>>            self.note = Note(self, wxSIMPLE_BORDER)
>>
>>    def newSticky(self, event=None):
>>        self.note = Note(self, wxSIMPLE_BORDER)
>>        publicID = self.parent.sharedAppClient.GetPublicId()
>>        self.parent.sharedAppClient.SendEvent("note", (publicID))
>>
>>
>>
>>
>>class Note(wxPopupWindow):
>>    def __init__(self, parent, style, text = None, pos = None):
>>
>>        self.parent = parent
>>
>>        wxPopupWindow.__init__(self, parent, style)
>>
>>        self.SetBackgroundColour("GOLDENROD")
>>
>>        self.SetSize((50,50))
>>
>>        self.Bind(EVT_LEFT_DOWN, self.OnMouseLeftDown)
>>        self.Bind(EVT_MOTION, self.OnMouseMotion)
>>        self.Bind(EVT_LEFT_UP, self.OnMouseLeftUp)
>>
>>        self.Show(1)
>>
>>    def OnMouseLeftDown(self, evt):
>>        self.ldPos =
> 
> evt.GetEventObject().ClientToScreen(evt.GetPosition())
> 
>>        self.wPos = self.ClientToScreen((0,0))
>>        self.CaptureMouse()
>>
>>    def OnMouseMotion(self, evt):
>>        if evt.Dragging() and evt.LeftIsDown():
>>            dPos = evt.GetEventObject().ClientToScreen(evt.GetPosition())
>>            nPos = (self.wPos.x + (dPos.x - self.ldPos.x),
>>                    self.wPos.y + (dPos.y - self.ldPos.y))
>>            self.Move(nPos)
>>
>>    def OnMouseLeftUp(self, evt):
>>        self.ReleaseMouse()
>>
>>
>>
>>if __name__ == "__main__":
>>
>>    from AccessGrid.Toolkit import CmdlineApplication
>>    app = CmdlineApplication.instance()
>>    app.Initialize("Sticky Board")
>>
>>    # Url from app properties dialog in venue client.  Change these!
>>    appUrl = 'https://vv2.mcs.anl.gov:9000/119'
>>    debugMode = 1
>>
>>    stickyBoard = StickyBoard(appUrl, debugMode, None)
>>    stickyBoard.MainLoop()
>>
>>
>>#############################end code####################################
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>-----Original Message-----
>>From: Susanne Lefvert [mailto:lefvert at mcs.anl.gov] 
>>Sent: June 21, 2004 3:12 PM
>>To: Rob King
>>Subject: RE: [AG-TECH] Errors silenced?
>>
>>
>>Hello Rob,
>>
>>I have tried to answer your questions below. 
>>
>>Regards,
>>
>>Susanne
>>
>>On Mon, 21 Jun 2004, Rob King wrote:
>>
>>
>>>	Hmmm... I think I must be missing something here...
>>>
>>>	I tried putting this in a file (test.py):
>>>
>>>from AccessGrid.Toolkit import CmdlineApplication
>>>app = CmdlineApplication.instance()
>>>app.Initialize("Sticky Board") 
>>>appUrl = 'https://vv2.mcs.anl.gov:9000/208'	
>>>
>>>And ran it, but nothing happened.  It just ran through and ended.
>>>I also tried with app.Initialize("StickyBoard.py"), and that did nothing
>>
>>as
>>
>>>well.
>>>
>>>So a few questions:
>>>Should <appName> be the name registered in the venue client, or the
>>>filename?
>>
>>
>>You can set <appName> to whatever you want, I used "SharedQuestionTool".
>>
>>
>>
>>>Should the code above be a standalone app run from a command prompt, or
>>>should the code be incorporated into my shared app code somehow?
>>>I looked in the toolkit.py sourcecode, and I can't find where it
> 
> actually
> 
>>>runs the app, or takes in the appURL... am I looking at this wrong?
>>
>>
>>You can see an example of how I am using the code in
>>/AccessGrid/sharedapps/SharedQuestionTool/SharedQuestionTool.py
>>
>>
>>
>>>I also took a look at the AccessGrid/tools/VenueApp.py file, and from
> 
> what
> 
>>I
>>
>>>could interpret, it seems to create an application session on the server
>>
>>but
>>
>>>doesn't run the application locally.  Again I may be mistaken though.
>>
>>
>>That's correct. You can use that code if you want to get access to an 
>>application url without having to open the application session properties 
>>dialog in the Venue Client. 
>>
>>
>>
>>>	Hopefully you can help me with this!
>>>
>>>	Thanks a lot,
>>>
>>>	Rob king
>>>
>>>-----Original Message-----
>>>From: owner-ag-tech at mcs.anl.gov [mailto:owner-ag-tech at mcs.anl.gov] On
>>
>>Behalf
>>
>>>Of Susanne Lefvert
>>>Sent: June 17, 2004 4:06 PM
>>>To: Rob King
>>>Cc: ag-tech at mcs.anl.gov
>>>Subject: Re: [AG-TECH] Errors silenced?
>>>
>>>
>>>Hello Rob,
>>>
>>>I am glad to hear that you are working on a shared application for the
> 
> AG 
> 
>>>and would like to help you with your logging issue.  Apparently, log
> 
> files
> 
>>>for shared apps are not created properly and we are working to get that 
>>>fixed.  In the mean time, you can use following code to test your app 
>>>outside of the venue client:
>>>
>>>from AccessGrid.Toolkit import CmdlineApplication
>>>app = CmdlineApplication.instance()
>>>app.Initialize("<appName>") 
>>>
>>># Url from app properties dialog in venue client (the 'Location 
>>># URL' field in the dialog that shows up when you right click the 
>>># application session you want to use and select 'Properties').
>>>appUrl = 'https://<host>:<port>/....'
>>>
>>>This will print errors to the console and create a log <appName>.log
> 
> file 
> 
>>>where you are running your application.  Also, 
>>>AccessGrid/tools/VenueApp.py in cvs shows you how to create an 
>>>application session in the venue without using the venue client.
> 
> 
>>>Hope this helps,
>>>
>>>Susanne
>>>
>>>  
>>>
>>>
>>>
>>>On Thu, 17 Jun 2004, Rob King wrote:
>>>
>>>
>>>>            Hello Everyone,
>>>>
>>>> 
>>>>
>>>>            I am working on developing a shared application right now,
>>
>>but
>>
>>>>have been having some problems.  I could probably figure them out, but
>>
>>it
>>
>>>>seems as though the errors are being suppressed somewhere.  It's
>>
>>happened
>>
>>>in
>>>
>>>>a couple of places so far, and problems become difficult to debug.  I
>>
>>have
>>
>>>>debug logging mode on, but when it gets to an error, it doesn't log
> 
> it,
> 
>>it
>>
>>>>just stops.  Is there some way to coax the error messages into a log
> 
> or
> 
>>>even
>>>
>>>>the debug console?  My current method of putting a debug log statement
>>>
>>>every
>>>
>>>>couple lines of code has only met with limited success ;)
>>>>
>>>>            Hope someone can help!
>>>>
>>>> 
>>>>
>>>>            -rob king
>>>>
>>>>
>>>
>>>
>>>__________ NOD32 1.772 (20040524) Information __________
>>>
>>>This message was checked by NOD32 Antivirus System.
>>>http://www.nod32.com
>>>
>>>
>>>
>>
>>__________ NOD32 1.772 (20040524) Information __________
>>
>>This message was checked by NOD32 Antivirus System.
>>http://www.nod32.com
>>
>>
>>
> 
> 
> 
> __________ NOD32 1.772 (20040524) Information __________
> 
> This message was checked by NOD32 Antivirus System.
> http://www.nod32.com
> 




More information about the ag-tech mailing list