From: "Jakub Pavlík jn." Date: 2009-01-19T18:06:17+09:00 Subject: Re: Thread starvation > On 18.01.2009 19:04, Jakub Pavl�k jn. wrote: > >Hello, > > > >In my game freeVikings [http://freevikings.sf.net] I have code listed > >below. > >It uses threads and sometimes problem known as "thread starvation" occurs. > >Does anyone know some solution? > >(A more detailed description is under the code listing.) > > > >---------------------------------- > >def do_loading(&block) > > Thread.abort_on_exception = true > > > > load_t = Thread.new { > > Thread.current.priority = 1 > > Thread.stop > > > > block.call > > } > > > > progressbar_t = Thread.new { > > Thread.current.priority = 2 > > load_t.run > > > > loop { > > paint_loading_screen @app_window, true > > sleep 0.3 > > } > > } > > > > load_t.join > > Thread.kill progressbar_t > >end > >---------------------------------- > > > >It's an instance method of class Game and is used in this way: > >a_game.do_loading { > > # load something here > >} > > > >Purpose of this method is to show a simple progressbar while doing some > >long-lasting operation (e.g. loading new level). > > > >It creates two threads: load_t, in which given block is executed > >and progressbar_t, which regularly calls Game#paint_loading_screen > >(method, which repaints loading screen with progressbar). > > > >Thread progressbar_t has higher priority, because I need it to be called > >often and not to e.g. wait for load_t's end. > > > >Unfortunatelly from time to time Thread load_t is somehow "suspended" - > >progressbar shows progress on and on, but nothing happens. > >I think it's a case of so called "thread starvation" and would be very glad > >to know how to avoid it. > > I guess this depends on what you do in "block". It's difficult to > analyze this without having all the information... > > Can you provide more detail? > > Cheers > > robert > > -- > remember.guy do |as, often| as.you_can - without end > Method do_loading is used for two purposes: 1. loading of a world: code in the block goes through a tree of directories and in each reads a XML file 2. loading of a level: two XML files (level description & map data created in Tiled) + one ruby script (which often requires many others) are loaded from a given directory, many graphics are loaded and huge SDL surfaces are built Thread starvation usually occurs in the second case. Jakub -- "Configure complete, now type 'make' and PRAY." (configure script of zsnes - www.zsnes.com)