2009-11-30 4 views
1

그래서이 그래픽 변환 프로그램을 함께 사용하고 갑자기 응용 프로그램이 응답하지 않게되었습니다. 메뉴가 더 이상 작동하지 않으며 패널 중 하나에 축과 격자를 그려야합니다 ... 아무 것도 없습니다. 어떤 아이디어?C#/Windows Forms : 응용 프로그램이 실행되지만 응답이 없습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace Transformer 
{ 
    public partial class Transformer : Form 
    { 
     /* Initialize parameters */ 
     private bool drawAxes = true; 
     private bool drawGrid = true; 

     private List<ObjectSettings> dispObjects = new List<ObjectSettings>(); 


     /* Initialize form */ 

     public Transformer() 
     { 
      InitializeComponent(); 
     } 

     private void Transformer_Load(object sender, EventArgs e) 
     { 
      // Populate available objects listbox 
      string currentDir = Directory.GetCurrentDirectory(); 
      string[] fileEntries = Directory.GetFiles(currentDir + @"\Objects"); 
      foreach (string s in fileEntries) { 
       int start = s.LastIndexOf(@"\"); 
       int end = s.LastIndexOf(@"."); 
       availObjectsListBox.Items.Add(s.Substring(start + 1, end - start - 1)); 
      } // end foreach 
     } 



     /* Paint graphics */ 

     // Paint main form 
     private void Transformer_Paint(object sender, PaintEventArgs e) 
     { 
     } 

     // Paint graphics panel 
     private void splitContainer2_Panel1_Paint(object sender, PaintEventArgs e) 
     { 
      Rectangle r = splitContainer2.Panel1.ClientRectangle; 
      Graphics g = splitContainer2.Panel1.CreateGraphics(); 
      Pen axisPen = new Pen(Color.Gray, 2.0f); 
      Pen gridPen = new Pen(Color.Gray, 1.0f); 

      g.Clear(Color.White); 

      if (drawAxes) { 
       g.DrawLine(axisPen, r.Left + 0.5f * r.Width, r.Top, r.Left + 0.5f * r.Width, r.Bottom); 
       g.DrawLine(axisPen, r.Left, r.Top + 0.5f * r.Height, r.Right, r.Top + 0.5f * r.Height); 
      } 

      if (drawGrid) { 
       // Vertical lines 
       int xVal = 0; 
       int xCenter = r.Width/2; 
       g.DrawLine(gridPen, xCenter, r.Top, xCenter, r.Bottom); 
       for (int i = 0; i < 10; i++) { 
        xVal += r.Width/20; 
        g.DrawLine(gridPen, xCenter + xVal, r.Top, xCenter + xVal, r.Bottom); 
        g.DrawLine(gridPen, xCenter - xVal, r.Top, xCenter - xVal, r.Bottom); 
       } 

       // Horizontal lines 
       int yVal = 0; 
       int yCenter = r.Height/2; 
       g.DrawLine(gridPen, r.Left, yCenter, r.Right, yCenter); 
       for (int i = 0; i < 10; i++) { 
        yVal += r.Height/20; 
        g.DrawLine(gridPen, r.Left, yCenter + yVal, r.Right, yCenter + yVal); 
        g.DrawLine(gridPen, r.Left, yCenter - yVal, r.Right, yCenter - yVal); 
       } 
      } 



      // foreach object in displayed objects 
      // keep list of displayed objects and their settings (make struct) 


      g.Dispose(); 
      axisPen.Dispose(); 
      gridPen.Dispose(); 
     } 


     /* File menu */ 

     private void saveImageToolStripMenuItem_Click(object sender, EventArgs e) 
     { 

     } 

     private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 


     /* Options menu */ 

     private void axesOnoffToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      if (drawAxes == true) 
       drawAxes = false; 
      else 
       drawAxes = true; 
     } 

     private void gridOnoffToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      if (drawGrid == true) 
       drawGrid = false; 
      else 
       drawGrid = true; 
     } 


     /* Help menu */ 

     private void helpToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      AboutBox dlg = new AboutBox(); 
      dlg.ShowDialog(); 
     } 


     /* Other stuff */ 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      Invalidate(); 
     } 

     // ">>" button 
     private void availToDispButton_Click(object sender, EventArgs e) 
     { 
      dispObjectsListBox.Items.Add(availObjectsListBox.SelectedItem); 
     } 

     // "<<" button 
     private void dispToAvailButton_Click(object sender, EventArgs e) 
     { 
      availObjectsListBox.Items.Add(dispObjectsListBox.SelectedItem); 
      dispObjectsListBox.Items.Remove(dispObjectsListBox.SelectedItem); 
     } 

     // Clear all button 
     private void clearAllButton_Click(object sender, EventArgs e) 
     { 

     } 

     // Update preview box 
     private void availObjectsListBox_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 


    } 
} 

고마워요!

+2

"나는 알아낼 수있는 몇 가지 변화가 응용 프로그램이 응답했다"...이 문제에 관련이있을 수 -

도 뭔가가 제거 된 제안 페인트 코드에 foreach 의견이있다 - 그것이 바로 버전 컨트롤입니다. ;) –

+0

작업 복사본의 어셈블리가 아직 있으면 반사 도구를 사용하여 리버스 엔지니어링 할 수 있습니다. 둘을 비교하고 diff를 찾을 수 있는지 확인하십시오. –

답변

0

로드 중일 때 분명히 디렉토리에있는 파일의 양이 GUI 스레드를 중단시킬 수 있습니다.

그 밖의 간단한 살펴보기를 사용하면 드로잉을 제어하는 ​​데 사용하는 bool을 확인하고 페인트 이벤트를 사용중인 패널이 실제로 표시되는지 확인할 수 있습니다.

또한 타이머가 실제로 똑딱 거리고 있는지 확인하고 간격을 확인해야합니다.

나는 또한 using 문 또는 적어도 finally 블록을 사용하여 살펴볼 것입니다. 그러나 그것은 당신의 질문에 관한 것이 아닙니다.

대부분은 분명하며 여기에 게시하기 전에 이미 확인했을 수 있습니다.하지만 놓친 경우를 대비하여 생각해 봤습니다. 다행스럽게도 나는 좀 더 자세하게 살펴보고 다른 것을 발견 할 수있는 기회를 얻게 될 것입니다.

+0

타이머, 가시성 등을 확인했습니다. 기괴한 것은 메뉴가 드롭 다운되지만, File-> Exit를 클릭하면 거기에 이벤트 핸들러가있을 때 아무 것도하지 않는다는 것입니다. – justin

+0

디자이너 코드가 이런 문제를 일으킬 수 있습니까? – justin

+0

이벤트 처리기에 문제가 있습니까? 이벤트 처리기를 이벤트에 연결하는 코드가 아직 있는지 확인하십시오. 메뉴 등이 작동하면 GUI 스레드가 중단되지 않아서 이벤트 와이어를 모두 잃어버린 것입니다. – Glenn

1

"로드"및 "페인트"코드를 (별도로) 주석 처리 해보십시오. 어떤 것이 문제인지 확인하십시오.

페인트가 문제라면 ... 자신의 Graphics을 만드는 것보다는 주어진 것을 사용하는 것이 좋습니다. 즉, e.Graphics. 당신이 이것을 만들지 않았다는 것을 유의하십시오. 그러므로 Dispose()에 당신의 직업이 아닙니다. 그렇게하지 마십시오. 또한 매번 필드를 생성하지 않고 Pen 등을 필드에 캐시합니다. 을 수행하는 경우을 작성하여 Pen (등등)을 작성하면 은 Dispose()의 더 좋은 방법입니다.

+0

로드 나 페인트가 문제가 아닌 것처럼 보입니다. 심지어 메뉴 이벤트 핸들러도 영향을받습니다. 드롭 다운되고 선택되어 보이지만 클릭 할 때 아무 것도하지 않습니다. – justin

관련 문제