<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
卡頓怎麼處理,多執行緒。多執行緒比timer好讀。看看timer和執行緒的關係。
1.winform 下的timer。就是拖控制元件到UI上的那個timer.
原始檔在這個路徑下C:WindowsMicrosoft.NETFramework64v4.0.30319
namespace System.Windows.Forms { // 摘要: 實現按使用者定義的時間間隔引發事件的計時器。 此計時器最宜用於 Windows 表單應用程式中,並且必須在視窗中 使用。 [DefaultEvent("Tick")] [DefaultProperty("Interval")][SRDescriptionAttribute("DescriptionTimer")][ToolboxItemFilter("System.Windows.Forms")] public class Timer : Component }
啟動timer程式碼如下:
[SRCategory("CatBehavior")] [DefaultValue(false)] [SRDescription("TimerEnabledDescr")] public virtual bool Enabled { get { if (this.timerWindow == null) { return this.enabled; } return this.timerWindow.IsTimerRunning; } set { lock (this.syncObj) { if (this.enabled != value) { this.enabled = value; if (!base.DesignMode) { if (value) { if (this.timerWindow == null) { this.timerWindow = new TimerNativeWindow(this); } this.timerRoot = GCHandle.Alloc(this); this.timerWindow.StartTimer(this.interval); } else { if (this.timerWindow != null) { this.timerWindow.StopTimer(); } if (this.timerRoot.IsAllocated) { this.timerRoot.Free(); } } } } } } }
最終呼叫了this.timerWindow.StartTimer(this.interval); 原始碼如下。
可見,最終呼叫的是系統的timer?系統是有定時器的。Ucos上,就有32個定時器,當然也可以開執行緒。
他們是不同的概念。windows 也差不多吧。這些定時器應該與CPU有關。
public void StartTimer(int interval) { if (this._timerID == 0 && !this._stoppingTimer && this.EnsureHandle()) { this._timerID = (int)SafeNativeMethods.SetTimer(new HandleRef(this, base.Handle), TimerNativeWindow.TimerID++, interval, IntPtr.Zero); } }
2. public sealed class Timer : MarshalByRefObject, IDisposable System.Threading.Timer
public Timer(TimerCallback callback) { int dueTime = -1; int period = -1; StackCrawlMark stackCrawlMark = StackCrawlMark.LookForMyCaller; this.TimerSetup(callback, this, (uint)dueTime, (uint)period, ref stackCrawlMark); } [SecurityCritical] private void TimerSetup(TimerCallback callback, object state, uint dueTime, uint period, ref StackCrawlMark stackMark) { if (callback == null) { throw new ArgumentNullException("TimerCallback"); } this.m_timer = new TimerHolder(new TimerQueueTimer(callback, state, dueTime, period, ref stackMark)); } [SecurityCritical] internal static void Pause() { TimerQueue.Instance.Pause(); } [SecurityCritical] internal static void Resume() { TimerQueue.Instance.Resume(); }
這裡是TimerQueue 佇列的操作。既然在Threading 名稱空間下,可能與執行緒有關。他在的dll 是 mscorlib.
3. System.Timers.Timer, 在system.dll中。 只是對 System.Threading.Timer的封裝。
[TimersDescription("TimerEnabled")] [DefaultValue(false)] public bool Enabled { get { return this.enabled; } set { if (base.DesignMode) { this.delayedEnable = value; this.enabled = value; } else if (this.initializing) { this.delayedEnable = value; } else if (this.enabled != value) { if (!value) { if (this.timer != null) { this.cookie = null; this.timer.Dispose(); this.timer = null; } this.enabled = value; } else { this.enabled = value; if (this.timer == null) { if (this.disposed) { throw new ObjectDisposedException(base.GetType().Name); } int num = (int)Math.Ceiling(this.interval); this.cookie = new object(); this.timer = new System.Threading.Timer(this.callback, this.cookie, num, this.autoReset ? num : (-1)); } else { this.UpdateTimer(); } } } } }
4.使用:
void Application_Start(object sender, EventArgs e) { // 在應用程式啟動時執行的程式碼 if (timer != null) { timer.Stop(); timer.Close(); timer = null; } int Interval = 3600000;//6 hours timer = new System.Timers.Timer(Interval);//十分鐘 timer.Elapsed += SendSMS.Send_ticker; timer.Interval = Interval; timer.Enabled = true; timer.Start(); }
在這個執行緒中,進行任務排隊。
任務1完成後,等待延時200ms,再執行任務2
private void Timer1_Tick(object sender, EventArgs e) { //throw new NotImplementedException(); Task.Run(() => { this.Invoke( new Action( () => { listBox1.Items.Add("進中斷"+DateTime.Now.ToString() + "rn"); })); //RS485.Set_io(7);//ok //RS485.Rest_io(7);//ok if (i > 8) i = 0; RS485.Set_io(i++);//ok this.Invoke(new Action(() => { listBox1.Items.Add("第1次輸出" + DateTime.Now.ToString() + "rn"); })); Thread.Sleep(200); RS485.Rest_io((ushort)(i - 2));//ok this.Invoke(new Action(() => { listBox1.Items.Add("第2次輸出" + DateTime.Now.ToString() + "rn"); })); Thread.Sleep(200); //RS485.Read_io_out(0,8);//ok RS485.Read_io_in(0, 8);//ok this.Invoke(new Action(() => { listBox1.Items.Add("第3次輸出" + DateTime.Now.ToString() + "rn"); })); //RS485.Read_io_Reg(0,4);// //RS485.Read_io_Regs(0, 6);// Thread.Sleep(200); }); }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45