none
兩個小問題,想請教是否用TIMER來做 RRS feed

  • 問題

  • 正在玩兩個小功能所想到的兩個小問題,

    第一個問題,我在FORM上的一個按鈕,

    希望按下去後,按鈕可以先失效5秒鐘,就是這5秒內不可再按,5秒後才可再開放

    我直覺是想要用TIMER來做做看,

    我想過用:

    button1.enable = false;

    timer_wait.interfal = 5000;

    timer_wait.enable = true;

    timer_wait_Tick

    等做法組合來寫,

    但這部份的邏輯我就已打了結,TIMER是周期性的行為,

    要怎麼做到每次時間內判斷,是還少了用什因子來用嗎?

     

    第二個小問題

    我和另一支程式Program B 在練習互傳指令,寫的方式是用SOCKET,

    在互傳指令的部份都OK,

    其中一項是就是當我傳的是"AAA"過去

    對方B就要回傳"BBB"回來

    但我想玩一個部份,如果我傳了"AAA"過去,但3秒內沒有收到他的"BBB"

    我程式就再傳一次"AAA"過去,

    也就是如果3秒內有收到回傳BBB,我就不會再傳"AAA",就停住做其他事

    這個作法我也是直覺想到用TIMER做做看,

    也是想用間隔的方法來寫,但有點想不通邏輯的寫法,

    因此想請教大家用TIMER的構想是否可行?

     

    這兩個問題應該是很常見的想法吧,

    只是還不知道要打什麼關鍵字來找,

    還請指導一下寫法或教學

    謝謝~

     

     

    2010年9月21日 下午 07:50

解答

  • 我直覺是想要用TIMER來做做看

    其實就如你自己所說的, 你想做的都不是週期性的動作, 使用 Timer 固然也是一種辦法, 但恐怕並不是必要的。通常在這種情形下, 開一個 thread 並下 thread.sleep 就可以了。以下範例中假設 Form 裡有一個按鈕 btn 和一個 Label lb -

     

    using System.Threading;
    
    namespace TestThread
    {
     public partial class Form1 : Form
     {
      private delegate void InvokeUpdateState();
    
      public Form1()
      {
       InitializeComponent();
      }
    
      private void btn_Click(object sender, EventArgs e)
      {
       btn.Enabled = false;
       Thread threadToWait = new Thread(disableButtonFor5Seconds);
       threadToWait.Start();
       lb.Text = "Wait 5 seconds before you can click this button again.";   
      }
    
      private void disableButtonFor5Seconds()
      {
       if (this.btn.InvokeRequired)
       {
        this.Invoke(new InvokeUpdateState(disableButtonFor5Seconds),
         new object[] { });
       }
       else
       {
        Thread.Sleep(5000);
        btn.Enabled = true;
       }
      }
     }
    }
    

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2010年9月28日 上午 09:16
  • 其實第二個問題, 用Socket.ReceiveTimeout 來做更適合, 因為當你設定TimeOut時一定時間沒有收到訊號, 就會產生一個SocketException , 所以只要欄截這個Exception, 然後根據ErrorCode屬性來判別是否為Time Out再處理後續程序是比較理想的做法.

    Socket ErrorCode請參考MSDN文件庫

    [Windows Sockets Error Codes ]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月3日 上午 07:09
    版主

所有回覆

  • C# Timer 類別

    http://msdn.microsoft.com/zh-tw/library/system.timers.timer%28v=VS.80%29.aspx

    (1) 當 AutoReset 設定為 false 時, timer 只會執行一次.

    (2) a.在收到回傳 BBB 的函式裡加上 BBBisback 的 boolen 值做判斷.

         b.在 timer elapsed 事件裡, 先判斷 BBBisback, 再決定要不要停下 timer.

    以上, 參考~

    2010年9月22日 上午 01:50
  • 也可參考 BillChung 的三篇關於Timer的文章

    1) Windows.Forms.Timer
    2) System.Timers.Timer
    3) System.Thread.Timer


    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    2010年9月22日 上午 02:23
  • 我直覺是想要用TIMER來做做看

    其實就如你自己所說的, 你想做的都不是週期性的動作, 使用 Timer 固然也是一種辦法, 但恐怕並不是必要的。通常在這種情形下, 開一個 thread 並下 thread.sleep 就可以了。以下範例中假設 Form 裡有一個按鈕 btn 和一個 Label lb -

     

    using System.Threading;
    
    namespace TestThread
    {
     public partial class Form1 : Form
     {
      private delegate void InvokeUpdateState();
    
      public Form1()
      {
       InitializeComponent();
      }
    
      private void btn_Click(object sender, EventArgs e)
      {
       btn.Enabled = false;
       Thread threadToWait = new Thread(disableButtonFor5Seconds);
       threadToWait.Start();
       lb.Text = "Wait 5 seconds before you can click this button again.";   
      }
    
      private void disableButtonFor5Seconds()
      {
       if (this.btn.InvokeRequired)
       {
        this.Invoke(new InvokeUpdateState(disableButtonFor5Seconds),
         new object[] { });
       }
       else
       {
        Thread.Sleep(5000);
        btn.Enabled = true;
       }
      }
     }
    }
    

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2010年9月28日 上午 09:16
  • 第一個問題,可以使用 System.Windows.Forms.Timer

            Timer timer = null;
            private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                if (timer==null)
                {
                    timer = new Timer();
                    timer.Tick += new EventHandler(timer_Tick);
                    timer.Interval = 5000;
                    timer.Start();
                }
            }

            void timer_Tick(object sender, EventArgs e)
            {
                button1.Enabled = true;
                timer.Stop();
                timer = null;
            }

     

    第二個問題

    當然可以使用Timer,建議使用

    System.Timers.Timer

    System.Thread.Timer

     

    2010年10月3日 上午 06:05
  • 其實第二個問題, 用Socket.ReceiveTimeout 來做更適合, 因為當你設定TimeOut時一定時間沒有收到訊號, 就會產生一個SocketException , 所以只要欄截這個Exception, 然後根據ErrorCode屬性來判別是否為Time Out再處理後續程序是比較理想的做法.

    Socket ErrorCode請參考MSDN文件庫

    [Windows Sockets Error Codes ]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月3日 上午 07:09
    版主
  • 請問這個問題解決了嗎 ?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月23日 下午 07:41
    版主
  • 給 Tenmo:

       如果你自己都不在意自己的問題, 為何別人要替你在意呢 ? 如果問題解決了, 請上來說明如何解決的, 你不覺得自己的態度非常不負責任嗎 ?

       還是想要搞到以後沒人想回你的問題 ?

    2010年11月3日 上午 02:03