Hi Krzysztof!
I have run also into this problem (trap). Threads in Tcl are different than in Java or C#. The tcl threads are more like new independent processes (at Tcl level).
New Thread in Tcl is just new Interpreter. Interpreter is environment to run Tcl code. (see command interp)
Every interpreter/thread has all internal structures (Tcl methods and verialbes) independent to another interpreter.
You can not share XOTcl Objects between interpreters because object name is just string reference to internal structure of object. Serializing object is probably not the solution for this what you need. You can share only values but not references.
The solution would be create in each thread separate bundle of XOTcl objects that can communicate with each other by sharing values (just strings)
My personal experience is not to use threads at all. You can use internal event handler of Tcl to simulate parallel processing. For example for GUI to program not freezing GUI or aborts buttons.
Use commands: after update vwait (Works also with XOTcl variables)
I have programmed spell checker for editor which runs in "update" loop and for user it seems to be completely parallel. Using tcl threads for it will be overkill. Also programming IO operations (for example Tcl Server) with events is better then using threads. Tcl has good support for asynchronous IO operations.
Tcl has very good event handling loop that is nearly the same that old OS uses (Windows 3.1) to simulate parallel processing. See tcl wiki for some examples.
Artur
Krzysztof Frukacz frukacz.krzysztof@gmail.com hat am 10. Februar 2011 um 14:27 geschrieben:
Hello again,
I am trying to add multi-threaded support for my application. I now face a problem witch combining XOTCl and Thread. The problem is that ::thread::create creates a new instance of interpreter which has own variables. I can have variables shared between threads using ::tsv functions. So here is how it looks:
- Thread #1 creates object myObject and stores in a shared variable:
::tsv::set array1 key1 [MyClass myObject]
- Thread #2 gets the shared variable and tries to call a proc defined
for MyClass: set localVar [::tsv::get array1 key1] $localVar doSomething
At this point second thread will throw en exception saying: Unknown command 'myObject'
What would be the proper way to "register" the object myObject (which already exists) in another thread?
-- Krzysztof _______________________________________________ Xotcl mailing list Xotcl@alice.wu-wien.ac.at http://alice.wu-wien.ac.at/mailman/listinfo/xotcl