Such a change should not cause the entire client to fail. Can you try
running the VenueClient from the command line and see what you get?
cd \program files\agtk-3\bin
venueclient3.py
Tom
On 4/23/07 10:14 AM, Nicolas Bertrand wrote:
Hi Thomas,
A fuller account of the symptoms.
The machine was not displaying any incoming video streams. A problem noticed
on a few other older dell optiplex machines. I shut down the venue client and
copied the patch processmanager.py file (see attached) as the routine procedure
when seeing that problem. The client does not launch anymore at all. :-s
Nic
"Thomas D. Uram" <[email protected]><mailto:[email protected]>
04/23 3:42 pm >>>
Hi Nic:
The only problem I see is a failure to connect to the Jabber text service
at one time last week, when there was a problem with the server, and
an error using the AGSC bridge.
Did you encounter some other problem?
Tom
On 4/23/07 4:16 AM, Nicolas Bertrand wrote:
Hi,
We are experiencing a problem launching the AG client on a winxp sp2 box.
see attached logs.
Any ideas?
Nic
_____
#-----------------------------------------------------------------------------
# Name: ProcessManager.py
# Purpose:
# Created: 2003/08/02
# RCS-ID: $Id: ProcessManager.py,v 1.11 2006/05/10 20:34:14 turam Exp $
# Copyright: (c) 2002-2003
# Licence: See COPYING.txt
#-----------------------------------------------------------------------------
"""
"""
__revision__ = "$Id: ProcessManager.py,v 1.11 2006/05/10 20:34:14 turam Exp
$"
import win32api
import win32con
import win32event
import win32process
from AccessGrid import Log
log = Log.GetLogger(Log.ProcessManager)
class ProcessManager:
def __init__(self):
self.processes = []
self.threadid = dict()
def WaitForChildren(self,callback):
log.warn('ProcessManager callback not yet implemented on Windows')
def StartProcess(self, command, arglist, detached = 1, maxWait = 20):
"""
Start a new process.
@param command : the name of the command to be started. It can
either be a full pathname or a command name to be found on the
default path.
@param arglist : is a list of the arguments to the command.
@param detached : a flag indicating whether this process
should be run detached or the process manager should wait for
it to complete execution to return.
@type command: string
@type arglist: list of strings
@type detached: integer
"""
if command.find(" ") != -1:
command = '"' + command + '"'
cmdline = command
for arg in arglist:
arg = str(arg)
if arg.find(" ") != -1:
#
# If there are spaces, quote the arg
#
arg = '"' + arg + '"'
cmdline += " " + arg
try:
startup_info = win32process.STARTUPINFO()
log.debug("Creating process: %s", cmdline)
info = win32process.CreateProcess(
None, # AppName
cmdline, # Command line
None, # Process security
None, # Thread security
0, # Inherit handles?
win32con.NORMAL_PRIORITY_CLASS|win32con.CREATE_NO_WINDOW,
None, # New environment
None, # Current directory
startup_info)
log.debug("Create process returns: %s", info)
pHandle = info[0]
self.processes.append(pHandle)
self.threadid[pHandle] = info[3]
if not detached:
pHandle = info[0]
wTime = 0
tIncr = 1
# We have to wait for it to finish
exitCode = win32process.GetExitCodeProcess(pHandle)
while exitCode == 259 and wTime < maxWait:
exitCode = win32process.GetExitCodeProcess(pHandle)
time.sleep(tIncr)
wTime = wTime + tIncr
else:
# Gotta kill it, sigh
self.TerminateProcess(pHandle)
retval = exitCode
else:
retval = pHandle
except win32process.error, e:
log.exception("process creation failed: %s", e)
retval = None
return retval
def TerminateAllProcesses(self):
"""
Cleanly shutdown all processes this manager has created.
"""
# Use a copy of the process list
processList = self.processes[:]
for phandle in processList:
try:
self.TerminateProcess(phandle)
except Exception, e:
log.exception("couldn't terminate process %s: %s", phandle,
e)
self.processes = []
self.threadid = dict()
def TerminateProcess(self, pid):
"""
Cleanly shutdown the specified process this manager has created.
@param pid: the id of the process to terminate.
@type pid: string? integer?
"""
terminated = 0
try:
ret = 0
win32api.PostThreadMessage(self.threadid[pid], 18, 0, 0)
ret = win32event.WaitForSingleObject(pid, 500 )
if ret == win32event.WAIT_OBJECT_0:
terminated = 1
else:
log.warn("Couldn't terminate process %s cleanly (%s)", pid,
str(ret))
except win32process.error,e:
log.exception("couldn't shutdown process %s: %s", pid, e)
if not terminated:
try:
win32process.TerminateProcess(pid, 0)
self.processes.remove(pid)
except win32process.error, e:
log.exception("couldn't terminate process %s: %s", pid, e)
del self.threadid[pid]
def KillAllProcesses(self):
"""
Kill all processes this manager has created.
@warning: this is not a clean shutdown, but a forced shutdown
that may result in system cruft.
"""
# Placeholder to remind implementor
# to operate on a copy of the list
# to avoid skipping procs
#processList = self.processes[:]
self.TerminateAllProcesses()
def KillProcess(self, pid):
"""
Kill a single process this manager has created.
@warning: this is not a clean shutdown, but a forced shutdown
that may result in system cruft.
@param pid: the id of the process to terminate.
@type pid: string? integer?
"""
self.TerminateProcess(pid)
def ListProcesses(self):
"""
Return a list of process id's for this process manager.
@returns: a list of process id's
"""
return self.processes
if __name__ == "__main__":
import time
mgr = ProcessManager()
try:
mgr.StartProcess("notepad", [r"\boot.ini"])
except Exception, e:
print "Exception starting process: ", e
try:
print mgr.ListProcesses()
except Exception, e:
print "Exception listing processes: ", e
time.sleep(5)
try:
mgr.TerminateAllProcesses()
except Exception, e:
print "Exception terminating processes: ", e
try:
mgr.StartProcess("notepad", [r"\boot.ini"], detached = 0)
except Exception, e:
print "Exception with non-detached process: ", e