![]() |
#1
|
|||
|
|||
Multithreading in Vizard 3.0
I'm currently using Vizard 3.0 and having trouble getting a simple multithreaded application to run. I wrote a script in IDLE using Python 2.3 (the same version as Vizard) and it works as expected. When it is run in Vizard, however, I get the following error:
"Unhandled exception in thread started by Error in sys.excepthook: Original exception was: Unhandled exception in thread started by Error in sys.excepthook: Original exception was: Unhandled exception in thread started by Error in sys.excepthook: Original exception was: Unhandled exception in thread started by Error in sys.excepthook: Original exception was:" The code is pretty simple and, as I said before, works as expected in IDLE. Code:
import thread def countingThread(id, maxVal): global printLock for i in range(maxVal): printLock.acquire() print "Thread ", id, ": ", i printLock.release() global printLock printLock = thread.allocate_lock() for i in range(5): thread.start_new_thread(countingThread, (i, 50)) |
#2
|
|||
|
|||
The problem is that your script does not wait for the threads to complete before exiting. I've modified your script to use the more advanced threading module. It will also wait for all the threads to complete before exiting. Here is the code:
Code:
import threading #Create mutex for printing printLock = threading.Lock() def countingThread(id, maxVal): global printLock for i in range(maxVal): printLock.acquire() print "Thread ", id, ": ", i printLock.release() threads = [] for i in range(5): #Create and start the threads t = threading.Thread(target=countingThread, args=(i, 50)) t.start() #Save thread object to list threads.append(t) #Wait for threads to complete for t in threads: t.join() |
#3
|
|||
|
|||
Great, thank you! Is there any reason this works correctly in IDLE but not in Vizard?
|
#4
|
|||
|
|||
Technically, your code should not work. I think the reason it works with IDLE is that IDLE runs the script in its embedded interpreter, which does not exit until the GUI is closed. If you ran the script directly from the command line, my guess would be that it would have the same problem as Vizard.
|
#5
|
|||
|
|||
That makes sense. I have one more question:
I would like to run a thread that monitors a bunch of sensors for a particular pattern. I set up a deamon thread that runs in a "while true:" loop, but this is still causing some problems. I also considered setting this up as an event, but I don't see how I can build a custom event that requires parameters being passed to the constructor. This is getting very frustrating because what I want to do is conceptually simple, but seems to be difficult to implement. Any advice would be appreciated. |
#6
|
|||
|
|||
What is the problem with your "while True:" loop? Are you yielding to other threads in the loop by issuing a time.sleep(...) call?
Are you talking about a custom threading event or a Vizard event? |
#7
|
|||
|
|||
Quote:
Code:
import viz import threading class ThreadedClass (threading.Thread): def run(self): i = 0 while True: i = i + 1 print i t = ThreadedClass() t.setDaemon(True) t.start() viz.go() 1 2 <you get the idea> 1051 ** Load Time: 0.12 seconds 1052 1053 <you get the idea> 1066 No matter how long the program is run for, it terminates at 1066. Also, the numbers 1052 to 1056 do not appear in the output window until the main program is stopped. It appears as if the thread is not running past a certain number of iterations. I've been looking around for resources on how to do this, but I am having difficulty finding any. Do you have any references so that I don't have to post for every problem I encounter? As always, thanks I appreciate the help. |
#8
|
|||
|
|||
Try adding the following line to your script:
Code:
viz.directormode(viz.DIRECTOR_FAST) |
#9
|
|||
|
|||
Wow you're quick on the draw. That worked perfectly! Thanks for the help and the reference....hopefully I won't have to bug you anymore
![]() |
#10
|
|||
|
|||
Is using threading.Threads objects possible while running a Vizard sim without the viz.directormode call? In other words, must you set the director mode when you want to run threading.Threads while running a Vizard sim?
__________________
Paul Elliott WorldViz LLC |
#11
|
|||
|
|||
It depends. The call to viz.directormode(viz.DIRECTOR_FAST) simply tells Vizard to allow other Python threads to run while it is rendering. If you don't have this flag set, then the only time your Python thread will run is after 100 Python virtual instructions have been executed in the main thread (see sys.setcheckinterval in the Python docs for more info).
If your thread is only performing computations or file i/o, then I would recommend setting this flag. If your thread is modifying the Vizard scene graph, then I would NOT set this flag. |
![]() |
Thread Tools | |
Display Modes | Rate This Thread |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Vizard won't run | wouters | Vizard | 5 | 02-05-2008 12:12 PM |
Fall 2007 release of Vizard R3 | 3 D | Announcements | 0 | 10-15-2007 05:50 PM |
McAfee Privacy Service 8.1 causes Vizard not to run | mspusch | Vizard | 0 | 03-01-2007 09:24 PM |
Matlab and Vizard | brystewa | Vizard | 1 | 09-18-2006 04:11 PM |
wxPython with Vizard | farshizzo | Vizard | 18 | 09-29-2005 09:49 AM |