2013-02-20 3 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

ответ

2

Ошибка приложения из-за вашего кода в событии таймера. Приложение продолжает работать даже после сбоя, потому что таймер не отключен или не установлен. Класс таймера запрашивает GC для сбора не используя - GCHandle.Alloc, когда вы устанавливаете timer.Enabled = true. Таким образом, даже после того, как ссылка на объект объекта таймера не достижима, это не будет собирать мусор. Устраните проблему в событии таймера и правильно расположите таймер.

Смежные вопросы