[AG-TECH] Shared app Gotchas
Susanne Lefvert
lefvert at mcs.anl.gov
Wed Jun 23 13:43:33 CDT 2004
That is a great idea! Thank you very much.
Cheers,
Susanne
On Wed, 23 Jun 2004, 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