[Gtk-sharp-list] yet another multithreading problem

ub boo@youfuckingbitch.com
Tue, 28 Sep 2004 18:57:05 +0200


i just checked out my mess of a code again and found an old method i 
totaly forgot about (from my very first try) that still tried to change 
the gtk stuff directly. removed it; works now :-)

ub wrote:

> hi list!
> i am trying to write an application which downloads articles from 
> usenet. the problem is, i dont get the download threads to work 
> properly. on_download_clicked i start a new thread which connects to a 
> usenetserver and downloads queued articles, and another thread which 
> loops infintely while downloading, monitors the progess and sends 
> information to the gui (updating the progressbar), but the app always 
> locks with something like: "Xlib: unexpected async reply (sequence 
> 0x196a)!"
> here's what i tried:
>
> public class GladeApp
> {
>    public static void Main(string[]args)
>    {
>        new GladeApp(args);
>    }
>
>    public static ThreadNotify notify;
>
>    public GladeApp (string[] args)
>    {
>        Gdk.Threads.Init();
>        Application.Init();
>
>        //lots of gui-stuff here [...]
>
>        notify = new ThreadNotify (new ReadyEvent (ready));
>             Gdk.Threads.Enter();
>        Application.Run();
>        Gdk.Threads.Leave();
>    }
>
>    static void ready()
>    {
>        filebar.Fraction = Traffic.snapshot;  //get the current 
> fraction from traffic class
>    }
>
>    public void on_download_clicked (object o, EventArgs e)
>    {
>        MainClass.Download();
>    }
> }
>
>
> public class MainClass  {
>    public static void Download()
>    {         NNTP nntp1 = new NNTP(files);
>        myThread = new Thread(new ThreadStart(nntp1.Start));
>        Traffic.downloading=true;
>        myThread.Start();
>        Thread monitor = new Thread(new 
> ThreadStart(Traffic.monitorTraffic));
>        monitor.Start();
>    }
> }
>
>
> public class Traffic
> {
>    public static double current = 0; //this gets updated from within 
> NNTP class
>    public static double snapshot;
>
>    //some methods to calculate fraction from filesize[...]
>
>    public static void monitorTraffic()
>    {
>        while (downloading){
>            Thread.Sleep(1000); //update the gui every second
>            snapshot = current;
>            Gdk.Threads.Enter();
>            GladeApp.notify.WakeupMain();
>            Gdk.Threads.Leave();
>        }
>    }
> }
>   thats it. i tried with and without the Gdk.Threads* stuff. it works 
> fine for a while, progressbar is updating, then the gui starts locking 
> up (i can get it back by pressing some button or opening a menu in the 
> menubar - is there something that can be done about this?  
> http://www.gtk.org/faq/#AEN492 says i should use gdk_flush(), but i 
> can't find an equivalent gtk#-method, i tried "while 
> (Application.EventsPending ()) Application.RunIteration ();" instead, 
> which seems to do what i want judging from the comments in the monodoc 
> sample code, but it instantly locks up the gui).
> anyway, playing around with the buttons/menus keeps the gui responsive 
> for a while, but then it totaly  locks up with the Xlib async reply 
> error.
> i also tried to update the progressbar without the monitor thread, 
> using Gtk.Timeout instead of ThreadNotify:
>
> in GladeApp Class
> [...]
> public void on_download_clicked (object o, EventArgs e)
> {
>    Traffic.downloading = true;
>    Gtk.Timeout.Add (500, new Gtk.Function (Monitor));
>    MainClass.Download();
> }
>
> bool Monitor()
> {
>    if (!Traffic.downloading)
>    {
>        return false;
>    }
>               progressbar1.Fraction=Traffic.current;
>    return true;
> }
>
> but again xlib async reply error, i am really out of ideas...
> thanks in advance
> Ulrich
>
>
>
>
>
> _______________________________________________
> Gtk-sharp-list maillist  -  Gtk-sharp-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
>