2013-04-26 3 views
2

현재 IRC 봇/클라이언트를 작성 중이며 작은 문제가 발생했습니다. 모든 채널은 고유 한 컨트롤 세트가있는 별도의 창에 표시됩니다. 창에 적절하게 편집 된 메시지를 보내는 별도의 스레드가 (있어야하는데) 때문에,생성자가 완료된 직후에 Windows Form이 사라짐

public partial class ChanWindow : Form 
{ 
    string Chan; 
    string Username; 

    IRCBot Caller; 

    public ChanWindow(string channame, string uname, IRCBot caller) 
    { 
     Caller = caller; 
     Caller.Join(channame); 
     InitializeComponent(); 
     Chan = channame; 
     Name = Chan; 
     Username = uname; 
    } 

    //various functionalities required for window use 
} 

나는 ConcurrentDictionary<string, ChanWindow>에서 윈도우 객체를 포함하고 있습니다 : 나는 적절한 창 클래스의 ChanWindow을 만들었습니다. 그들은 모든 루프 초기화됩니다 Chanlist가 가입 채널의 List<string>

foreach (string chan in Chanlist) 
{ 
    Chans[chan] = new ChanWindow(chan, Name, this); 
    Chans[chan].Show(); 
} 

입니다. 프로그램이 시작된 직후에 창문이 죽는 것을 목격 한 후, ChanWindow 생성자의 Username = uname; 줄에 중단 점을 넣었으며 창이 사라지기 직전에 중단 된 것으로 나타났습니다.

내 주요 질문은 : 원인은 무엇이며 어떻게 피할 수 있습니까? 사전을 사용하는 것이 좋은 생각입니까? 창 기능을 처리 할 수있는 일종의 래퍼/컨테이너 클래스를 빌드해야합니까?

+0

메인을 제외한 모든 스레드가 UI에 씁니까? –

+0

내가 틀렸다고 말하지만'Channs [chan] .Show()'같은 것을 할 필요가 없습니까? –

+0

@DanPichelman 아무 일도 일어나기 전에 창문이 죽은 이후로 그렇게 할 기회가 없지만 나는 계획을 세웠다. –

답변

4

난 당신이 (기본적으로 Program.Main()) 주 진입 점에서

Application.Run(new ChanWindow()); 

이없는 생각한다.

기본 GUI 스레드 Show을 양식으로 만들고 닫을 때까지 기다리지 않으면 스레드가 완료되지 않고 응용 프로그램이 닫히지 않습니다. 당신이 메시지 루프를 시작하려면


독립적으로 당신은 여전히 ​​메인 스레드가 이벤트를 처리하기 시작합니다 Application.Run()를 호출해야합니다. 매개 변수없이 호출하면 메시지 루프가 자동으로 중지되지 않으므로 메시지 루프를 중지하려면 명시 적으로 Application.Exit()에 전화해야합니다. 그런 다음 주 스레드는 프로그램의 끝까지 계속 끝납니다.

당신은 당신의 코드에이 작업을 수행 할 수

,

foreach (string chan in Chanlist) 
{ 
    Chans[chan] = new ChanWindow(chan, Name, this); 
    Chans[chan].Show(); 
} 

Application.Run(); 

하지만, 당신이 자동으로 상속받을 수있는 응용 프로그램을 종료하려면 자신의 ApplicationContextalready linked MSDN documentation에 설명하고, Application.Run()에 그것을 통과, 그 결국 그것은 무엇을위한 것입니다.

+0

이렇게 보이는 것 같습니다. 이것은 내 첫 Windows Forms 프로젝트이며 시작 지점은 어쨌든 콘솔 응용 프로그램이었습니다. 수퍼 창을 만들 필요가 있습니까? 새 창을 만든 후에'Application.Run (Chans [chan]) '을 호출 할 때마다 프로그램을 닫을 때까지 프로그램이 진행되지 않으므로. –

+0

'Application.Run'을 호출하면 주 스레드는 이벤트에만 응답합니다. 프로그램은'Application.Exit'는 암시 적으로 또는 직접 호출됩니다. Form.Show()와 Application.Run() 사이에서 원하는 코드를 수행 할 수 있지만 호출 될 때까지는 메시지 루프가 시작되지 않고 이벤트 처리가 시작되지 않습니다. – Jodrell

+0

상황에 따라 마지막 폼을 닫을 때 응용 프로그램을 자동으로 닫고 싶다고 가정 할 때, 자신의'ApplicationContext'를 만들고 그것을'Application.Run()'에 넘겨 주면 예제가 링크 뒤에 있습니다. – Jodrell

관련 문제