event loop problem
alex116321 at my-deja.com
alex116321 at my-deja.com
Tue Oct 24 11:40:57 EDT 2000
Thanks for the info Geoff. My program works fine now.
Alex
In article <mailman.972333065.14276.python-list at python.org>,
Geoff Talvola <gtalvola at NameConnector.com> wrote:
> I know exactly the problem you're talking about -- and I consider it
a huge
> design flaw in NT that any one application can cause other
applications to
> hang if it's not processing its message loop. Starting up PythonWin
is
> another example of something you can't do if any program isn't
processing
> its messages.
>
> There are 2 solutions I can think of. First of all, win32all already
> contains a function that can process all waiting messages:
> win32gui.PumpWaitingMessages() inserted into your while loop should
do the
> trick.
>
> But a better solution is to tell win32com to run in free-threading
mode, in
> which case it doesn't create a hidden window and everything works fine
> without having to process messages. To do this, add the following
lines
> BEFORE you import win32com:
>
> import sys
> sys.coinit_flags = 0
>
> and if you are using multiple threads, each thread besides the main
thread
> should call
>
> pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED)
>
> when they are initialized, and
>
> pythoncom.CoUninitialize()
>
> when they exit. If you're not using multiple threads, you don't need
the
> CoInitializeEx and CoUninitialize.
>
> See the excellent book Python Programming on Win32 if you need more
> details.
>
> alex116321 at my-deja.com wrote:
>
> > I am trying to write a simple Python script which which uses ADO
> > through Python's COM extension but never exit. For this I have
writen
> > a simple while loop however this causes a problem on Windows NT.
> > Sometimes other windows on NT broadcast messages which need to be
> > confirmed by all running windows. If at least one window does not
> > dispatch the confirmation, the broadcaster will hang. In C++ the
> > solution is to make the main event loop listen for windows messages,
> > for example:
> >
> > while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) {
> > TranslateMessage(&msg);
> > DispatchMessage(&msg);
> > }
> >
> > However, I cannot seem to find an equivalence in Python except to
use
> > Tkinter and use the mainloop function. Unfortunately, I do not
require
> > any graphics in my program. This is my Python script:
> >
> > ######################################################
> > import time, win32com.client
> >
> > # Dispatch Microsoft ActiveX Data Objects (ADO)
> > rset = win32com.client.Dispatch("ADODB.RecordSet")
> >
> > query = "select cAFUserAccountP from Person"
> > dbstring = "DRIVER={SQL Server};SERVER=svr-tor-
> > dev;DATABASE=SMS_HP_1.2.0;UID=sa;PWD="
> >
> > rset.Open(query, dbstring)
> > rset.Close()
> >
> > while 1:
> > time.sleep(0.01)
> >
> > ##########################################################
> >
> > While this script is running, try setting the time through the
windows
> > Date/Time Properties window. The window will get stuck until the
> > python script is killed. This is because it tries to broadcast a
> > message but the python application window does not respond.
Actually,
> > ADO opens a hidden window and causes this problem. If ADO is not
used,
> > no problem exists. Any help would be greatly appreciated.
>
> --
>
> - Geoff Talvola
> Parlance Corporation
> gtalvola at NameConnector.com
>
>
Sent via Deja.com http://www.deja.com/
Before you buy.
More information about the Python-list
mailing list