[Gtk-sharp-list] GLib.Timerout How to use?
Michael Hutchinson
m.j.hutchinson at gmail.com
Sun Sep 14 11:52:33 EDT 2008
On Sun, Sep 14, 2008 at 4:37 AM, True Friend <true.friend2004 at gmail.com> wrote:
> Thanks a lot. It is working fine now. I used this code on windows and was
> trying to search something like it on mono as well.
> ----------------------------------------------
> void ToolStripMenuItemAutoSaveClick(object sender, EventArgs e)
> {
> ToolStripMenuItem item = (ToolStripMenuItem)sender;
> if(item.Checked == true)
> {
> timer = new Timer();
> timer.Interval = 6000;
> timer.Start();
> timer.Tick += AutoSaveEventHandler;
> }
> else
> {
> timer.Stop();
> }
> }
> //auto save event handler
> void AutoSaveEventHandler(object sender, EventArgs e)
> {
> if(Form1.textFilePath != null)
> {
> if(pattern.IsMatch(textFilePath) == true)
> {
> string f = File.ReadAllText(textFilePath);
> string pathg = textFilePath + "~";
> File.WriteAllText(pathg, f);
> urduRichTextBox1.SaveFile(textFilePath,
> RichTextBoxStreamType.RichText);
> }
> else{
> string f = File.ReadAllText(textFilePath);
> string pathg = textFilePath + "~";
> File.WriteAllText(pathg, f);
> urduRichTextBox1.SaveFile(textFilePath,
> RichTextBoxStreamType.UnicodePlainText);
> }
> }
> ----------------------------------------------------
> You can see there is no separate thread involved here, System.Timers.Timer
> class is working fine. I tried to use this class but the event Timer.Tick
> wasn't available and when I tried to use Timer.Elapsed event.
> -----------------------------------------------------
> if(Action4.Active == true)
> {
>
> if(textFilePath == null)
> {
> OnSaveActionActivated(sender, e);
> }
> timer = new Timer();
> timer.Interval = 300;
> timer.Start();
> timer.Elapsed += AutoSaveEventHandler;
> }
> else
> {
> timer.Stop();
> }
> ------------------------------------------
> It was pretty much straight forward but I couldn't get it work on mono, it
> also frozen the GUI. Can you tell me whats wrong with this code?
System.Timers.Timer does use a thread internally, and the "Elapsed"
callback is invoked on this other thread.
See http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx#remarksToggle
which says:
" If you use the Timer with a user interface element, such as a form
or control, assign the form or control that contains the Timer to the
SynchronizingObject property, so that the event is marshaled to the
user interface thread. "
You have been lucky that it works on winforms... it's still quite
possible that your code will hang, unless you add synchronisation.
You can still use timers with GTK#, but you will have to use
Gtk.Application.Invoke to run delegates on the GUI thread:
timer.Elapsed += delegate {
Application.Invoke (delegate {
AutoSave()();
})
});
GLib.Timeouts are a much nicer (thread-less) model.
--
Michael Hutchinson
http://mjhutchinson.com
More information about the Gtk-sharp-list
mailing list