2013-02-20 26 views
1

我创建了a video,它解释了我的问题。在文本形式 - 我的主窗体崩溃时运行计时器,我不知道为什么,应用程序继续运行,即使主窗体似乎已经崩溃。窗体没有响应,但计时器仍在运行

namespace ItunesGamesEqualiser 
{ 
    public partial class GUI : Form 
    { 
     private void refreshBar_Scroll(object sender, EventArgs e) 
     { 
      timer1.Interval = prbLevel.Value; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      timer1.Start(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      AudioSessionControl session; 
      AudioSessionControl itunesSession; 
      MMDeviceEnumerator DevEnum = new MMDeviceEnumerator(); 
      MMDevice device = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia); 
      // Note the AudioSession manager did not have a method to enumerate all sessions in windows Vista 
      // this will only work on Win7 and newer. 
      for (int i = 0; i < device.AudioSessionManager.Sessions.Count; i++) 
      { 
       itunesSession = device.AudioSessionManager.Sessions[i]; 

       if (itunesSession.SessionIdentifier.Contains("iTunes") == true) //find itunes audio service 
       { 
        for (int j = 0; j < device.AudioSessionManager.Sessions.Count; j++) 
        { 
         session = device.AudioSessionManager.Sessions[j]; 
         if (session.SessionIdentifier.Contains("iTunes") == false) //find game audio service 
         { 

          if (session.State == AudioSessionState.AudioSessionStateActive) 
          { 
           Process p = Process.GetProcessById((int)session.ProcessID); 
           Console.WriteLine("ProcessName: {0}", p.ProcessName); 
           AudioMeterInformation mi = session.AudioMeterInformation; 
           AudioMeterInformation imi = itunesSession.AudioMeterInformation; 
           SimpleAudioVolume vol = session.SimpleAudioVolume; 
           SimpleAudioVolume ivol = itunesSession.SimpleAudioVolume; 
           //int start = Console.CursorTop; 
           ivol.MasterVolume = 1; 
           float origVol = ivol.MasterVolume; 
           while (true) 
           { 
            //Draw a VU meter 
            int len = (int)(mi.MasterPeakValue * 79); 
            int ilen = (int)(imi.MasterPeakValue * 79); 
            //Console.SetCursorPosition(0, start); 
            //Game Meter 
            if (len > 30) 
            { 
             float curvol = origVol - (0.1f * (len - 10)/10); 
             if (curvol < 0) curvol = 0; 
             ivol.MasterVolume = curvol; 
             prbLevel.Value = len; 
            } 
            else 
            { 
             ivol.MasterVolume = origVol; 
             //Console.WriteLine("null"); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
      //If we end up here there where no open audio sessions to monitor. 
      lblName.Text = "No game found, please start game and iTunes"; 
     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      timer1.Stop(); 
     } 
    } 
} 
+0

也许我错了,但如果表单崩溃并且应用程序继续运行,那可能是因为您只使用一个线程。尝试使用一个线程启动timer1时。 – Andres 2013-02-20 05:13:41

回答

2

由于计时器滴答事件中的代码导致应用程序崩溃。应用程序即使在崩溃后也会继续运行,因为定时器未被禁用或处置。当您设置timer.Enabled = true时,Timer类请求GC不使用 - GCHandle.Alloc进行收集。所以即使在定时器对象引用无法访问之后,它也不会被垃圾收集。解决您的计时器滴答事件中的问题,并正确放置计时器。

相关问题