[Gtk-sharp-list] Threading problem on Windows
D. Dobrev
dpldobrev at yahoo.com
Tue Dec 2 15:08:05 EST 2008
Thank you very much, Michael, this works perfectly on both Windows and Linux.
Michael Hutchinson wrote:
>
> On Mon, Dec 1, 2008 at 4:54 PM, D. Dobrev <dpldobrev at yahoo.com> wrote:
>>
>> Hello.
>> I have the following code:
>> protected virtual void OnButtonOneDieClicked(object sender, EventArgs e)
>> {
>> if (this.isDieRolling)
>> {
>> this.isDieRolling = false;
>> }
>> else
>> {
>> this.isDieRolling = true;
>> Thread thread = new Thread(() =>
>> {
>> while
>> (this.isDieRolling)
>> {
>>
>> Thread.Sleep(1);
>>
>> Application.Invoke((image, args) =>
>>
>> {
>>
>> this.imageOneDie.Pixbuf = this.RollDie();
>>
>> });
>> }
>> });
>> thread.Start();
>> }
>> }
>>
>> Its purpose is: when the button is first clicked, a few pictures (the
>> sides
>> of a die) begin rapidly changing. The second click stops the changes
>> (this
>> simulates the rolling of a die). In Linux this works perfectly, but in
>> Windows the rolling rate is variable: it begins fast, then it slows down,
>> then again fast, etc., with random intervals. Does anyone have an idea
>> what
>> the problem might be? If this helps, the source of my application can be
>> found attached at the bottom of my
>> http://www.nabble.com/forum/ViewPost.jtp?post=20758097&framed=y previous
>> thread .
>
> You don't need a thread here -- all it's giving you is semi-random
> intervals of calling this.imageOneDie.Pixbuf = this.RollDie().
> Thread.Sleep causes a context switch, so the thread's rate depends on
> the OS' scheduler. The Application.Invoke is run on another thread
> (the GTK# thread), so this also depends on the scheduler.
>
> I recommend a GLib.Timeout: see
> http://www.mono-project.com/Responsive_Applications#Timeouts and
> http://www.go-mono.com/docs/monodoc.ashx?link=T%3aGLib.Timeout
>
> It runs directly on the GTK thread at a specified rate, e.g. 30FPS
> (33ms / frame):
>
> protected virtual void OnButtonOneDieClicked(object sender, EventArgs e)
> {
> if (this.isDieRolling) {
> this.isDieRolling = false;
> } else {
> this.isDieRolling = true;
> GLib.Timeout.Add (33, delegate {
> this.imageOneDie.Pixbuf = this.RollDie();
> return this.isDieRolling;
> });
> }
> }
>
> There may be other factors involved, but the thread certainly isn't
> doing any good.
>
> --
> Michael Hutchinson
> http://mjhutchinson.com
> _______________________________________________
> Gtk-sharp-list maillist - Gtk-sharp-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
>
>
--
View this message in context: http://www.nabble.com/Threading-problem-on-Windows-tp20781412p20799835.html
Sent from the Mono - Gtk# mailing list archive at Nabble.com.
More information about the Gtk-sharp-list
mailing list