From: Mats M. <mat...@gm...> - 2008-08-01 09:07:40
|
Hi, I have a windows app that behaves strangely on shutdown. Basically, the app is using twisted and uses twisted's reactor as the "event loop". However, on shutdown and compiled as a windows, not console, app, the app never exists the "event loop" but rather just gets killed. This gives my code no opportunity to release resources it is holding on to etc. I have looked at all the py2exe email archives and the site but nothing seems to address how the exe gets "shutdown". I am looking for a way for me to run some code when Windows signals a shutdown (or logoff). BTW I realize this is a possible for a service but want to keep my app as an app for now. TIA, Mats |
From: Mark H. <mha...@sk...> - 2008-08-02 02:32:34
|
You will probably find this isn't specific to py2exe and it behaves the same when running under pythonw.exe - if that isn't true, you should probably chase up why things are different rather than re-inventing your own. But something like the following might help: import win32api, win32con def console_ctrl_handler(evt): # NOTE that this is called on its own thread ... # False means "run the next/default handler", True means don't call others. rc = False # During a log-off etc process the console is also closed, so this works # OK here. if evt in (win32con.CTRL_CLOSE_EVENT, win32con.CTRL_LOGOFF_EVENT): ... do something to *asynchronously* close the app. rc = True return rc ... win32api.SetConsoleCtrlHandler(console_ctrl_handler, True) Note that the above is untested and was pulled from an app that will either have a console or a real window, so just uses win32con.CTRL_CLOSE_EVENT (and relies on the window being closed at logoff) so you might need to experiment with exactly which events you need to handle (and as I implied above, try and find out if twisted is expected to handle this situation ok already, or already has a "Console Control Handler" that needs tweaking, etc) Also, take care of threading issues - unlike a unix signal, this comes on a new thread created just for the purpose of delivering the event, so you will need to find out how to break your event loop externally. HTH, Mark ----------- From: py2...@li... [mailto:py2...@li...] On Behalf Of Mats Myrberg Sent: Friday, 1 August 2008 7:08 PM To: py2...@li... Subject: [Py2exe-users] Executing code at shutdown (windows) Hi, I have a windows app that behaves strangely on shutdown. Basically, the app is using twisted and uses twisted's reactor as the "event loop". However, on shutdown and compiled as a windows, not console, app, the app never exists the "event loop" but rather just gets killed. This gives my code no opportunity to release resources it is holding on to etc. I have looked at all the py2exe email archives and the site but nothing seems to address how the exe gets "shutdown". I am looking for a way for me to run some code when Windows signals a shutdown (or logoff). BTW I realize this is a possible for a service but want to keep my app as an app for now. TIA, Mats |
From: Mats M. <mat...@gm...> - 2008-08-03 19:54:13
|
I did try this and while reading the API docs it seems SetConsoleCtrlHandler only applies to console apps. My app is a windows app (vs console app) and so SetConsoleCtrlHandler does not seem to work for my app. And that seems to be the case when I run my app as well. It seems like a great solution for console apps. Are there parallel solutions for a "faceless" windows apps? I realize I could create a service but I am trying to stay away from that for various reasons. Mats On Fri, Aug 1, 2008 at 7:31 PM, Mark Hammond <mha...@sk...>wrote: > You will probably find this isn't specific to py2exe and it behaves the > same > when running under pythonw.exe - if that isn't true, you should probably > chase up why things are different rather than re-inventing your own. But > something like the following might help: > > import win32api, win32con > def console_ctrl_handler(evt): > # NOTE that this is called on its own thread > ... > # False means "run the next/default handler", True means don't call > others. > rc = False > # During a log-off etc process the console is also closed, so this works > # OK here. > if evt in (win32con.CTRL_CLOSE_EVENT, win32con.CTRL_LOGOFF_EVENT): > ... do something to *asynchronously* close the app. > rc = True > return rc > > ... > win32api.SetConsoleCtrlHandler(console_ctrl_handler, True) > > Note that the above is untested and was pulled from an app that will either > have a console or a real window, so just uses win32con.CTRL_CLOSE_EVENT > (and > relies on the window being closed at logoff) so you might need to > experiment > with exactly which events you need to handle (and as I implied above, try > and find out if twisted is expected to handle this situation ok already, or > already has a "Console Control Handler" that needs tweaking, etc) Also, > take care of threading issues - unlike a unix signal, this comes on a new > thread created just for the purpose of delivering the event, so you will > need to find out how to break your event loop externally. > > HTH, > > Mark > ----------- > From: py2...@li... > [mailto:py2...@li...] On Behalf Of Mats > Myrberg > Sent: Friday, 1 August 2008 7:08 PM > To: py2...@li... > Subject: [Py2exe-users] Executing code at shutdown (windows) > > Hi, > > I have a windows app that behaves strangely on shutdown. Basically, the > app > is using twisted and uses twisted's reactor as the "event loop". However, > on shutdown and compiled as a windows, not console, app, the app never > exists the "event loop" but rather just gets killed. This gives my code no > opportunity to release resources it is holding on to etc. I have looked > at > all the py2exe email archives and the site but nothing seems to address how > the exe gets "shutdown". > > I am looking for a way for me to run some code when Windows signals a > shutdown (or logoff). BTW I realize this is a possible for a service but > want to keep my app as an app for now. > > TIA, > > Mats > > > |
From: Mark H. <mha...@sk...> - 2008-08-03 22:51:04
|
The next thing I'd try is creating a hidden top-level window and seeing if that gets closed - you'd probably need to create your own thread for the window and the message loop. Some of the win32\Demos\win32gui_*.py have hidden windows you may be able to adapt. Cheers, Mark From: Mats Myrberg [mailto:mat...@gm...] Sent: Monday, 4 August 2008 5:54 AM To: Mark Hammond Cc: py2...@li... Subject: Re: [Py2exe-users] Executing code at shutdown (windows) I did try this and while reading the API docs it seems SetConsoleCtrlHandler only applies to console apps. My app is a windows app (vs console app) and so SetConsoleCtrlHandler does not seem to work for my app. And that seems to be the case when I run my app as well. It seems like a great solution for console apps. Are there parallel solutions for a "faceless" windows apps? I realize I could create a service but I am trying to stay away from that for various reasons. Mats On Fri, Aug 1, 2008 at 7:31 PM, Mark Hammond <mha...@sk...> wrote: You will probably find this isn't specific to py2exe and it behaves the same when running under pythonw.exe - if that isn't true, you should probably chase up why things are different rather than re-inventing your own. But something like the following might help: import win32api, win32con def console_ctrl_handler(evt): # NOTE that this is called on its own thread ... # False means "run the next/default handler", True means don't call others. rc = False # During a log-off etc process the console is also closed, so this works # OK here. if evt in (win32con.CTRL_CLOSE_EVENT, win32con.CTRL_LOGOFF_EVENT): ... do something to *asynchronously* close the app. rc = True return rc ... win32api.SetConsoleCtrlHandler(console_ctrl_handler, True) Note that the above is untested and was pulled from an app that will either have a console or a real window, so just uses win32con.CTRL_CLOSE_EVENT (and relies on the window being closed at logoff) so you might need to experiment with exactly which events you need to handle (and as I implied above, try and find out if twisted is expected to handle this situation ok already, or already has a "Console Control Handler" that needs tweaking, etc) Also, take care of threading issues - unlike a unix signal, this comes on a new thread created just for the purpose of delivering the event, so you will need to find out how to break your event loop externally. HTH, Mark ----------- From: py2...@li... [mailto:py2...@li...] On Behalf Of Mats Myrberg Sent: Friday, 1 August 2008 7:08 PM To: py2...@li... Subject: [Py2exe-users] Executing code at shutdown (windows) Hi, I have a windows app that behaves strangely on shutdown. Basically, the app is using twisted and uses twisted's reactor as the "event loop". However, on shutdown and compiled as a windows, not console, app, the app never exists the "event loop" but rather just gets killed. This gives my code no opportunity to release resources it is holding on to etc. I have looked at all the py2exe email archives and the site but nothing seems to address how the exe gets "shutdown". I am looking for a way for me to run some code when Windows signals a shutdown (or logoff). BTW I realize this is a possible for a service but want to keep my app as an app for now. TIA, Mats |
From: Dennis H. <dh...@2t...> - 2008-08-04 08:52:38
|
In another work area of mine, I have gathered a little knowledge which might be at use here .. When Windows gets the shutdown message, it will first close or kill the logged in user's processes, then the system's processes. Hence, to gain a little time at shutdown, once should try and let the process, that awaits the shutdown message, and needs to run something, run as system, if at all possible. Just my 2 cent's worth .. Have a nice day Dennis Dennis Hestbech Systemkonsulent dh...@2t... www.2tal-mobilITy.dk +45 2785 5673 >>> "Mark Hammond" <mha...@sk...> 04-08-2008 00:49 >>> The next thing I'd try is creating a hidden top-level window and seeing if that gets closed - you'd probably need to create your own thread for the window and the message loop. Some of the win32\Demos\win32gui_*.py have hidden windows you may be able to adapt. Cheers, Mark From: Mats Myrberg [mailto:mat...@gm...] Sent: Monday, 4 August 2008 5:54 AM To: Mark Hammond Cc: py2...@li... Subject: Re: [Py2exe-users] Executing code at shutdown (windows) I did try this and while reading the API docs it seems SetConsoleCtrlHandler only applies to console apps. My app is a windows app (vs console app) and so SetConsoleCtrlHandler does not seem to work for my app. And that seems to be the case when I run my app as well. It seems like a great solution for console apps. Are there parallel solutions for a "faceless" windows apps? I realize I could create a service but I am trying to stay away from that for various reasons. Mats On Fri, Aug 1, 2008 at 7:31 PM, Mark Hammond <mha...@sk...> wrote: You will probably find this isn't specific to py2exe and it behaves the same when running under pythonw.exe - if that isn't true, you should probably chase up why things are different rather than re-inventing your own. But something like the following might help: import win32api, win32con def console_ctrl_handler(evt): # NOTE that this is called on its own thread .. # False means "run the next/default handler", True means don't call others. rc = False # During a log-off etc process the console is also closed, so this works # OK here. if evt in (win32con.CTRL_CLOSE_EVENT, win32con.CTRL_LOGOFF_EVENT): .. do something to *asynchronously* close the app. rc = True return rc .. win32api.SetConsoleCtrlHandler(console_ctrl_handler, True) Note that the above is untested and was pulled from an app that will either have a console or a real window, so just uses win32con.CTRL_CLOSE_EVENT (and relies on the window being closed at logoff) so you might need to experiment with exactly which events you need to handle (and as I implied above, try and find out if twisted is expected to handle this situation ok already, or already has a "Console Control Handler" that needs tweaking, etc) Also, take care of threading issues - unlike a unix signal, this comes on a new thread created just for the purpose of delivering the event, so you will need to find out how to break your event loop externally. HTH, Mark ----------- From: py2...@li... [mailto:py2...@li...] On Behalf Of Mats Myrberg Sent: Friday, 1 August 2008 7:08 PM To: py2...@li... Subject: [Py2exe-users] Executing code at shutdown (windows) Hi, I have a windows app that behaves strangely on shutdown. Basically, the app is using twisted and uses twisted's reactor as the "event loop". However, on shutdown and compiled as a windows, not console, app, the app never exists the "event loop" but rather just gets killed. This gives my code no opportunity to release resources it is holding on to etc. I have looked at all the py2exe email archives and the site but nothing seems to address how the exe gets "shutdown". I am looking for a way for me to run some code when Windows signals a shutdown (or logoff). BTW I realize this is a possible for a service but want to keep my app as an app for now. TIA, Mats |