2011-08-15 2 views
0

Castle Windsor를 프레임 워크로 사용하는 C# .net 프로그램을 유지 관리하고 있습니다. 또한 양식을 꾸미기 위해 Skincrafter를 사용합니다.한 코드 경로가 즉시 양식을 다른 페이지에 표시하는 이유는 무엇입니까?

우리는 USB 장치에서 파일의 존재를 감지하고이를 처리 할 수있는 다른 형식을 생성하는 기능을 가지고 있습니다. 소프트웨어는 Windows에서 USB 이벤트를 발생 시키거나 사용자가 재확인을 강제하는 버튼을 누를 때 파일을 검사합니다.

사용자가 재검사를 강요하면 파일이 발견되면 양식이 기본 양식 위에 나타나고 Skincrafter가 장식합니다. USB 이벤트가 발생하면 양식이 생성되지만 상단에 나타나지 않으며 (작업 표시 줄에서이를 클릭해야 볼 수 있음) Skincrafter가 장식하지 않습니다.

파일을 검색하는 두 가지 방법 모두 동일한 기능을합니다.이 기능은 프로그램의 다른 부분에 파일 처리 양식을 생성하도록 지시합니다. 디버깅 할 때 발견 한 유일한 차이점은 강제 재검사 방법은 주 스레드를 사용하는 반면 USB 이벤트 메서드는 표시되는 양식을 통과하는 자체 하위 스레드임을 확인하는 것입니다.

Windows가 양식을 생산하지 않게하는 별도의 스레드입니까? (아마도 Skincrafter에서 무시할 수 있습니다) 또는 다른 문제가 있습니까?

필자는 필요한 경우 코드를 게시 할 수 있지만 파일 경로를 호출하는 메소드 이외의 코드 경로는 동일하며 데이터는 동일합니다.

편집 - 코드 :

이것은 내가 만든 단순한 재구성입니다. System.Management가 포함 된 새로운 WinForms 프로젝트가 참조에 추가되었습니다. 그냥 버튼 형태 (CenterScreen로 설정 FormStartPosition를)하고이 코드를 사용합니다

public partial class Form1 : Form 
{ 
    private ManagementEventWatcher _eventWatcher = null; 
    int devices = 0; 

    public Form1() 
    { 
     InitializeComponent(); 
      WqlEventQuery q = new WqlEventQuery(); 
      q.EventClassName = "__InstanceOperationEvent"; 
      q.WithinInterval = new TimeSpan(0, 0, 3); 
      q.Condition = @"TargetInstance ISA 'Win32_USBControllerDevice' "; 
      _eventWatcher = new ManagementEventWatcher(q); 
      _eventWatcher.EventArrived += new EventArrivedEventHandler(UsbEventArrived); 
      _eventWatcher.Start(); // Start listen for events 

    } 

    private void UsbEventArrived(object sender, EventArrivedEventArgs e) 
    { 
     if(System.Environment.GetLogicalDrives().Length - devices != 0) { 
      ShowThingy(); 
      devices = System.Environment.GetLogicalDrives().Length; 
     } 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     ShowThingy(); 
    } 

    private void ShowThingy() 
    { 
     Form form2 = new Form(); 
     form2.Size = new Size(50, 50); 
     form2.StartPosition = FormStartPosition.CenterParent; 
     form2.TopMost = true; 
     form2.ShowDialog(); 
    } 

} 

실행하고 USB 장치를 삽입하고 Form2를 양식은 기본 양식 뒤에 나타납니다.

이 때마다 문제가 다시 발생하지 않는 것 같습니다. 하지만 USB 장치를 처음 연결하면 처음에는 항상 두 번째 형식을 만드는 것처럼 보입니다. 버튼을 클릭 할 때마다 매번 두 번째 양식이 생성됩니다.

내가 윈도우 7

+0

일부 코드를 게시하십시오. 그렇지 않으면 추측입니다. 또한 윈저가 어떻게 관련되는지 보지 못했습니다. 조금 더 설명해 주시겠습니까? –

+0

끝에 코드를 첨부했습니다. Windsor가 스레드에 문제를 일으킬 수 있는지 여부를 알지 못하여 Windsor에 대해 언급 했으므로 관련 세부 사항이었습니다. – Septih

+0

너무 많은 관련이없는 코드가있는 것처럼 보입니다 ... 독립 실행 형 테스트로 범위를 좁힐 수 있습니까? –

답변

0

당신은 모달 창에 대한 소유자를 설정하지 않을하고 있는데, 기본은 (주 창하지 않을 수 있습니다) 활성 창 있음을 알아 두셔야합니다.

소유자가 걸리는 ShowDialog의 오버로드를 사용하면 어떻게됩니까?

form2.ShowDialog(this); 

그래도 작동하지 않으면 스레딩 문제가 심하게납니다. USB 이벤트 핸들러를 변경하여 양식에 Invoke을 사용할 수 있습니까?

+0

ShowDialog (this)를 사용하면 상자가 전혀 표시되지 않습니다.내가 BeginInvoke를 사용하여 시도하고 그 예를 들어,하지만 내 실제 프로그램에 대한 작동합니다. 내 프로그램에서 Invoke를 강제로 호출하면 대리자 코드가 실제로 이상하지 않습니다. – Septih

관련 문제