2013-02-18 123 views
-1

我正在爲我的Logitech G510 LCD鍵盤編寫一個小型應用程序,並遇到一些小問題。繪製到我的屏幕後,我希望我的程序變得閒置並保持活動狀態,但不會消耗計算機上的任何資源。C#:非阻塞睡眠

但是,每當發生某個事件時,我都需要打開一個表單。我相信Thread.Sleep()不是最好的方式來做到這一點。

這裏是我的代碼大致是這樣的:

int main(){ 
    InitLCD(); 
    DrawStuff(); 

    Wait(); 
} 

void HandleEvent(){ 
    //Create a Form if none exists 
} 

//Must be called before exiting 
void OnExit() 
{ 
    CloseLCD(); 
} 

也許可以其關心的事件單獨的線程是一個解決辦法?如果是這樣,怎麼樣?

編輯://該應用程序是一個不可見的WinForm應用程序。這意味着,開始時不會創建任何表單。只有當這個事件發生時,纔會創建一個實際的表單。

+1

它是一個WinForm應用程序嗎? – 2013-02-18 02:19:02

+0

它實際上是一個「隱形」應用程序。意思是,執行後沒有UI,除非事件被引發,那麼WinForm被創建。 – 2013-02-18 02:20:55

+0

程序如何保持活動狀態?直到int'Main()'存在或'Application.Run()' – 2013-02-18 02:22:45

回答

1

嘗試邏輯是這樣的:

public static class Program 
    { 
     private static AutoResetEvent waithandle = new AutoResetEvent(true); 
     static void Main() 
     { 
      LCDClass lcd = new LCDClass(); 
      lcd.mid_event += LcdOnMidEvent; 
      lcd.exit_event += LcdOnExitEvent; 
      lcd.init(); 


      Thread thread = new Thread(lcd.DrawStuff); 
      thread.Start(waithandle); 
      waithandle.WaitOne(); 

     } 

     private static void LcdOnExitEvent(object sendet, EventArgs eventArgs) 
     { 
      //lcd work finished 
     } 

     private static void LcdOnMidEvent(object sendet, EventArgs eventArgs) 
     { 
      // handle event, create form 
      Application.Run(new MyForm()); 
     } 

    } 

    internal class LCDClass 
    { 
     private AutoResetEvent waithandle; 
     internal delegate void MyEventHandler(object sendet, EventArgs e); 

     internal event MyEventHandler mid_event; 

     protected virtual void OnMidEvent(object sendet) 
     { 
      MyEventHandler handler = mid_event; 
      if (handler != null) handler(sendet, EventArgs.Empty); 
     } 

     internal event MyEventHandler exit_event; 

     protected virtual void OnExitEvent(object sendet) 
     { 
      MyEventHandler handler = exit_event; 
      if (handler != null) handler(sendet, EventArgs.Empty); 
     } 

     public void init() 
     { 
     } 

     public void DrawStuff(object state) 
     { 
      // do work here 

      // raise event 
      mid_event(this, null); 

      //do more work 

      // raise event 
      exit_event(this, null); 
      waithandle.Set(); 

     } 

    } 
+0

內存使用情況如何?它看起來相當耗費,雖然我還不能測試它 – 2013-02-18 02:49:59

+1

不是真的!等待手柄是專門爲此目的而設計的 – 2013-02-18 02:51:49