From: Nick N. <nic...@in...> - 2003-02-21 17:44:30
|
Hi all, back from my examinations period, I'll have some spare time (there's gdkPixbuf waiting for me). As you can guess from the subject, I have troubles with threads, while making a small experiment with gtk2hs. The action mainGUI blocks and makes all the threads block; a current workaround I am using is (note that Widget is not Gtk.Widget) runGUI :: Widget -> IO () runGUI (Widget w) = do forkIO (do Gtk.initGUI w sequence_ (repeat (threadDelay 20000 >> Gtk.mainIterationDo False))) return () However, the interface is not responsive, and I fear that on slow computers 20 milliseconds could be too few. Maybe the attribute "threadsafe" should be added somewhere. I don't know where it could be added, and if gtk2 is thread safe. Are you already aware of the problem? What could you advice on the use of ghc threads and gtk2hs? Thanks for attention Vincenzo |
From: Nick N. <nic...@in...> - 2003-02-21 17:51:01
|
On Fri, 21 Feb 2003 18:46:59 +0100 Nick Name <nic...@in...> wrote: > > However, the interface is not responsive by checking the number of waiting events for each poll, and flushing the queue, the interface becomes responsive. However, a big quantity of events would let the user interface steal the cpu to other threads again. Vincenzo |
From: Axel S. <A....@uk...> - 2003-02-24 14:45:56
|
On Fri, Feb 21, 2003 at 06:46:59PM +0100, Nick Name wrote: > Hi all, back from my examinations period, I'll have some spare time > (there's gdkPixbuf waiting for me). Good! > As you can guess from the subject, I have troubles with threads, while > making a small experiment with gtk2hs. > > The action mainGUI blocks and makes all the threads block; a current > workaround I am using is (note that Widget is not Gtk.Widget) > > runGUI :: Widget -> IO () > runGUI (Widget w) = do > forkIO (do > Gtk.initGUI > w > sequence_ (repeat (threadDelay 20000 >> > Gtk.mainIterationDo False))) > return () > > However, the interface is not responsive, and I fear that on slow > computers 20 milliseconds could be too few. I think this is the more clumsy version of forcing gtk and ghc run in parallel. Instead of running the main loop of Gtk once in a while I think you are better off running Haskell when Gtk is idle: Gtk.idleAdd (yield >> return False) Gtk.priorityDefault Gtk.mainGUI > Maybe the attribute "threadsafe" should be added somewhere. I don't know > where it could be added, and if gtk2 is thread safe. Gtk itself is not multi-threaded but it is thread safe. That is, the application can use several threads that can all call Gtk, but no two calls of Gtk functions may run at the same time. As long as ghc does not have native OS threads, this is not a problem. > Are you already aware of the problem? What could you advice on the use > of ghc threads and gtk2hs? Either use the idleAdd hack or call "mainIterationDo False" when you do something which takes a little longer. I might not see all the problems, so if this does not solve your problem, let me know. Axel. |
From: Nick N. <nic...@in...> - 2003-02-24 18:23:35
|
On Mon, 24 Feb 2003 14:44:44 +0000 Axel Simon <A....@uk...> wrote: > I think this is the more clumsy version of forcing gtk and ghc run in > > parallel. Instead of running the main loop of Gtk once in a while I > think you are better off running Haskell when Gtk is idle: > > Gtk.idleAdd (yield >> return False) Gtk.priorityDefault > Gtk.mainGUI However, this does not work, and putting a sleep >> before that yield does not help, either. My current "state of the art" is something like: sequence_ $ repeat (do threadDelay 20000 whileM (Gtk.eventsPending >>= return . (0<)) (Gtk.mainIterationDo False) This is "just working", but it "just sucks" (TM) ! > calls of Gtk functions may run at the same time. As long as ghc does > not have native OS threads, this is not a problem. Consider http://www.cse.unsw.edu.au/~chak/haskell/ghc/comm/rts-libs/multi-thread.html Perhaps we have to wait when --enable-threaded-rts will become enabled by default in GHC (anyone has ideas? M.C. ?) Vincenzo |
From: Axel S. <A....@uk...> - 2003-02-26 23:29:55
|
On Mon, Feb 24, 2003 at 07:26:09PM +0100, Nick Name wrote: > On Mon, 24 Feb 2003 14:44:44 +0000 > Axel Simon <A....@uk...> wrote: > > > I think this is the more clumsy version of forcing gtk and ghc run in > > > > parallel. Instead of running the main loop of Gtk once in a while I > > think you are better off running Haskell when Gtk is idle: > > > > Gtk.idleAdd (yield >> return False) Gtk.priorityDefault > > Gtk.mainGUI > > However, this does not work, and putting a sleep >> before that yield > does not help, either. Ups, my fault. Try Gtk.idleAdd (yield >> return True) 500 The priorityDefault value is unfortunately not exported. This should be fixed. Axel. |
From: Nick N. <nic...@in...> - 2003-02-27 08:30:19
|
On Wed, 26 Feb 2003 23:28:33 +0000 Axel Simon <A....@uk...> wrote: > > Ups, my fault. Try > > Gtk.idleAdd (yield >> return True) 500 > > The priorityDefault value is unfortunately not exported. This should > be fixed. Thanks, this works and does not suck :) However, I had my code using priorityDefault compile and run, what does it mean that it was not exported? V. |
From: Axel S. <A....@uk...> - 2003-02-27 09:07:15
|
On Thu, Feb 27, 2003 at 09:32:56AM +0100, Nick Name wrote: > On Wed, 26 Feb 2003 23:28:33 +0000 > Axel Simon <A....@uk...> wrote: > > > > > Ups, my fault. Try > > > > Gtk.idleAdd (yield >> return True) 500 > > > > The priorityDefault value is unfortunately not exported. This should > > be fixed. > > Thanks, this works and does not suck :) However, I had my code using > priorityDefault compile and run, what does it mean that it was not > exported? I think priorityDefault is not in scope when you just import Gtk. It might be in scope if you import Structs - haven't tried that. Axel. |
From: Axel S. <A....@uk...> - 2003-02-27 10:13:26
|
On Thu, Feb 27, 2003 at 10:55:46AM +0100, Nick Name wrote: > On Thu, 27 Feb 2003 09:05:43 +0000 > Axel Simon <A....@uk...> wrote: > > > It > > might be in scope if you import Structs - haven't tried that. > > Yes, I did so. But it didn't work. Maybe 500 is a different value than > priorityDefault? ? I don't understand. I thought it worked. I changed General.chs to export the three priorities. If you update those changes, the following code will run even if you don't explicitly import Structs. As it is, it should work with the current release. I added this as a demo named "concurrent". Axel. import Gtk import Structs import Concurrent main :: IO () main = do initGUI dia <- dialogNew dialogAddButton dia stockButtonClose ResponseClose contain <- dialogGetUpper dia pb <- progressBarNew boxPackStartDefaults contain pb widgetShowAll dia forkIO (doTask pb) idleAdd (yield >> return True) priorityDefault dialogRun dia return () doTask :: ProgressBar -> IO () doTask pb = do progressBarPulse pb threadDelay 1000000 doTask pb |