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: [email protected] [mailto:[email protected]] On Behalf > Of Susanne Lefvert > Sent: June 22, 2004 5:54 PM > To: Rob King > Cc: [email protected] > 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:[email protected]] >>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: [email protected] [mailto:[email protected]] On >> >>Behalf >> >>>Of Susanne Lefvert >>>Sent: June 17, 2004 4:06 PM >>>To: Rob King >>>Cc: [email protected] >>>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 >

