From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id UAA24889 for caml-redistribution; Mon, 22 Mar 1999 20:02:15 +0100 (MET) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id TAA08933 for ; Mon, 22 Mar 1999 19:39:14 +0100 (MET) Received: from linc.cis.upenn.edu (LINC.CIS.UPENN.EDU [158.130.12.3]) by nez-perce.inria.fr (8.8.7/8.8.7) with ESMTP id TAA26662 for ; Mon, 22 Mar 1999 19:39:13 +0100 (MET) Received: from saul.cis.upenn.edu (SAUL.CIS.UPENN.EDU [158.130.12.4]) by linc.cis.upenn.edu (8.8.5/8.8.5) with ESMTP id NAA17699; Mon, 22 Mar 1999 13:39:11 -0500 (EST) Received: (from tjim@localhost) by saul.cis.upenn.edu (8.8.5/8.8.5) id NAA20107; Mon, 22 Mar 1999 13:39:10 -0500 (EST) Date: Mon, 22 Mar 1999 13:39:10 -0500 (EST) Message-Id: <199903221839.NAA20107@saul.cis.upenn.edu> From: Trevor Jim To: dsyme@microsoft.com CC: caml-list@inria.fr In-reply-to: <39ADCF833E74D111A2D700805F1951EF0F00BA6B@RED-MSG-06> (message from Don Syme on Mon, 15 Mar 1999 07:05:21 -0800) Subject: Re: threads & OCamlTK References: <39ADCF833E74D111A2D700805F1951EF0F00BA6B@RED-MSG-06> Sender: weis I've been using camltk with threads for a while. I find it is faster to run Tk as its own process -- the thread scheduler doesn't seem to do a good job with Tk involved. But, if you are running Windows this may not be possible. The Tk process will need to communicate with the other processes; the most convenient way to do this is with sockets; and to the best of my knowledge in Windows it isn't possible to use sockets unless you are actually plugged in to the network. So, if you want to run on your Windows laptop, you are stuck with threads. My program uses one thread to run a Tk gui. I have the gui periodically poll for input from the other threads. I use channels and events to do this. Here's a useful function: let install_poll(poll_function) = let rec install () = Timer.add 1 (* Do this every 1 millisecond *) (fun () -> (match poll (receive guichannel) with None -> () | Some le -> poll_function [le]); install() (* After every poll we have to reinstall *) ); () in install() A main thread creates guichannel and all the other threads. The Tk thread invokes install_poll on a polling function of its choice, taking input from guichannel. The other threads write to guichannel. This assumes "open Event". BTW this doesn't work with bytecode threads. Windows uses native threads but for Unix systems you may have to install ocaml with a flag to get native threads. Under Solaris, it works poorly even with native threads. So, I also use a variant of install_poll to read from a socket instead of a channel. It's useful when I plug my laptop in to the network, or when I'm running Unix and I can run the Tk part in its own process. Anyone know a better way? -Trevor