2013-06-19 3 views
1

일부 오류가 발생하는 USB 장치를 나타내는 양식이 있습니다. 아무런 소스가없는 이상한 오류를 디버깅한지 반나절 후, 터미널이 인스턴스화되었지만 표시되지 않을 때 터미널이 작동하지 않는다는 것을 알게되었습니다. 코드를 변경하고 usbTerminal.Show()를 추가하면 제대로 작동합니다..Show()가 호출되지 않으면 양식이 작동하지 않습니다.

USBTerminal usbTouchTerminal; 

public MainForm() 
{ 

InitializeComponent(); 

USBSettings usbTouchSettings = new USBSettings(); 
usbTouchTerminal = new USBTerminal(usbTouchSettings);   //Create Terminal with settings 
usbTouchTerminal.StartUSB();          
usbTouchTerminal.Show();   //works ONLY when show is here 

} 

어떻게 가능하며 그 이유는 무엇입니까? 방대한 검색을했는데 내 코드는 내 터미널이나 기본 폼의 .Visible 속성에 따라 다릅니다.

표시되지 않는 경우 일부 양식이 작동하지 않는 이유에 대해 완전히 당황 스럽습니다. MSDN 또는 google도 도움이되지 않았습니다. 인스턴스화 될 때 제대로 작동하지만 표시되지 않을 것이라고 확신했습니다.

추신. 덧붙여서

usbTerminal.Show(); 
usbTerminal.Hide(); 

그리고 터미널이 올바르게 기능했습니다.

도움 주셔서 감사합니다.

편집 :

나는이 usbTerminal는 WndProc을 재정의를 사용하는 점에 유의해야한다. 나는 그것에 대해 전문가가 아니지만, 그 일과 관련이 있다고 생각합니다.

나는이 양식에서 onShow 이벤트가 호출 될 때 일부 필수 기능을 호출 할 것이기 때문에 LibUSBdotnet

public class USBSettings 
{ 
    /// <summary> 
    /// This is the Vender ID Number. (0x0B6A) 
    /// </summary> 
    public ushort VID { get; set; } 

    /// <summary> 
    /// This is the Product ID Number. (0x5346) 
    /// </summary> 
    public ushort PID { get; set; } 

    /// <summary> 
    /// This is the optional Serial Name. ("") 
    /// </summary> 
    public string SerialName { get; set; } 

    /// <summary> 
    /// This is the Reader USB Endpoint. (ReadEndpointID.Ep02) 
    /// </summary> 
    public ReadEndpointID ReaderEndpoint { get; set; } 

    /// <summary> 
    /// This is the Writer USB Endpoint. (WriteEndpointID.Ep01) 
    /// </summary> 
    public WriteEndpointID WriterEndpoint { get; set; } 

    /// <summary> 
    /// This is the Registry Key for USB settings. ("SOFTWARE\\DEFAULT\\USBPROPERTIES") 
    /// </summary> 
    public string SubKey { get; set; } 

    /// <summary> 
    /// This is the default read buffer size for the USB Device. 
    /// </summary> 
    public int ReadBufferSize { get; set; } 

    /// <summary> 
    /// This constructor houses default values for all properties. 
    /// </summary> 
    public USBSettings() 
    { 
     VID = 0x0B6A; 
     PID = 0x5346; 
     SerialName = ""; 
     ReaderEndpoint = ReadEndpointID.Ep02; 
     WriterEndpoint = WriteEndpointID.Ep01; 
     SubKey = "SOFTWARE\\DEFAULT\\USBPROPERTIES"; 
     ReadBufferSize = 100; 
    } 

} 
+0

무엇입니까? 어떻게 작동하지 않습니까? – SLaks

+0

이 양식입니까? 어떻게해야합니까? usbTouchSettings의 코드는 어떻게 생겼습니까? – Bit

+0

임베디드 시스템에 연결된 USB 터미널입니다. 기본적으로, 그것은해야 할 때 어떤 데이터를받지 못합니다. 터미널에는 기본 응용 프로그램 기능과 함께 제대로 작동하지 않는 수신 및 전송 목록 상자가 있습니다. – bassplayer142

답변

5

질문에 대한 문서화가 잘되어 있지 않지만 기기와 호환되는 코드의 경우 정상입니다. 그들은 플러그 & 이벤트에 대해 알아야하는 경향이 있으며 WM_DEVICECHANGE 알림 메시지를 수신하는 최상위 창을 만들어야합니다. .NET Form 개체를 만드는 것만으로는 충분하지 않습니다. 또한 네이티브 창을 만들어야합니다. 일반적인 .NET 게으른 방식으로 윈도우를 강제로 표시 할 수있는 마지막 순간에 발생합니다. Show() 메서드를 호출하거나 Visible 속성을 true로 설정하십시오. 이 창은 실제로 플러그 알림 & 재생 알림을 표시 할 필요가 없습니다.

사용자 창을 표시하지 않고 생성하십시오. USBTerminal 클래스를 수정해야합니다. 이 코드를 붙여 넣으십시오 :

protected override void SetVisibleCore(bool value) { 
     if (!this.IsHandleCreated) { 
      this.CreateHandle(); 
      value = false; 
     } 
     base.SetVisibleCore(value); 
    } 

그리고 정상적으로 Show() 메소드를 호출하십시오. 창이 실제로 표시 될 때까지 Load 이벤트가 발생하지 않도록주의하십시오. 필요한 경우 이벤트 처리기의 모든 코드를이 메서드로 이동하십시오. 응용 프로그램의 주 윈도우가 아니라면 Main() 메서드에서 Application.Run()으로 전달 된 윈도우가 아니라면 간단하게이 메서드를 호출하면됩니다.CreateHandle() 폼 생성자의 마지막 문으로. 이 경우 Show() 호출은 더 이상 필요하지 않습니다.

+0

감사합니다. – bassplayer142

0

있음을 알아 두셔야합니다.

1

Show()를 호출하기 전에 기본 창이 만들어지지 않았기 때문입니다. 윈도우가 생성되지 않기 때문에 커스텀 WndProc은 호출되지 않습니다.

확인하려면 표시하지 않고 창을 만들 수 있습니다 (Handle property 참조). 문서가 말한대로 - 당신이 호출 할 때까지 핸들이 생성되지 않았다면 핸들이 생성 될 것입니다. 시도해보십시오. 마치 Show으로 전화를 걸었고 Hide으로 전화 한 것처럼 작동합니다.

+0

이 문제를 해결하는 데 도움을 주셔서 감사합니다 – bassplayer142

1

당신이 가지고있는 정보로는 이야기하기가 어렵지만, 당신이 수업을 사용해야하는 양식을 사용하고 있다고 생각합니다. 프로그램 구조를 다시 생각해보고이를 필요에 따라 데이터를 보유하고 전송하는 클래스로 다시 작성해야합니다. 다른 일부는 목록 상자 및/또는 다른 함수가 양식이 표시되고 메소드가 실행될 때까지 실행 중이 지 않음을 지적했습니다.

+0

고맙습니다. 나는 폼 생성과 기본 컨트롤에 대한 자세한 내용을 배울 필요가 있다고 느낀다. – bassplayer142