2012-10-16 6 views
1

내가 쉽게 생각할 수있는 것은 빨리 나를 무너 뜨리는 것입니다. 저는 네이티브 C# 프로그래머가 아니지만 단일 인스턴스가있는 WinForm 응용 프로그램을 만들지 않았습니까? 필자는 이미 StackOverflow에 Mutex 예제를 보았습니다. 그러나 저를 피할 수있는 한 가지는 명령 행에서 매개 변수를 창에 전달하고 값을 구문 분석 한 후 양식을 새로운 값으로 다시 칠하는 기능입니다.단일 인스턴스 C# 창 다시 그려진

누구나 예제가 있습니까? 나를 걸려 넘어지는 주요한 일은 스레딩입니다. 나는 my.exe를 실행하고 윈도우를 보여주고 싶다. 양식이 실행될 때마다 새 양식이 필요하지 않습니다. 단지 새 매개 변수를 가져 와서 양식에 표시하십시오.

일부/모든 답장을 환영합니다!

+0

자세한 내용을 입력하십시오. 예를 들어 창문이라고 부르는 방법에 대한 예입니다. –

+2

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx –

+0

@ HansPassant의 제안 +1 IMHO이 답변으로 게시되어 투표 한 사람이어야합니다.)) –

답변

1

응용 프로그램의 다른 인스턴스를 시작하면 동일한 코드가 실행되지만 다른 프로세스에서 실행됩니다. 따라서, 당신은 passing data between processes을 봐야합니다. Named Pipes 또는 Remoting과 같은 것.

+0

첫 번째 반응은 RabbitMQ와 같은 중개인을 사용하는 것이지만이 프로젝트는 매우 낮게 책정되었으며 C# 프로그래밍을 처음 시작했습니다. 한스 패전트 (Hans Passant)가 남긴 의견은 내가 한 일입니다. 답장을 보내 주셔서 감사합니다! – Griff

+0

VB의 'WindowsFormsApplicationBase'에 대해 몰랐습니다. 아주 간단한 해결책입니다. 하지만 여전히 동일합니다 - 제가 제안한 것처럼 Remoting을 사용합니다 –

0

@ lazyberezovsky가 맞습니다. 명령 줄에서 응용 프로그램을 다시 호출하면 관련이없는 다른 프로세스가 생성되고 새 프로세스가 호출되기 전에 프로세스 매개 통신을 통해 이전에 실행중인 응용 프로그램 인스턴스로 새 매개 변수를 전달해야합니다.

IMHO,이 두 프로세스간에 통신하는 가장 쉬운 방법은 Windows 레지스트리를 사용하는 것입니다. Windows 레지스트리는 이미 스레드로부터 안전하며 API는 매우 간단합니다.

먼저 응용 프로그램이 실행될 때 주 양식을 표시하기 전에 perform a check to see if another instance of the app is running이 표시됩니다.

false 인 경우 응용 프로그램이 처음 실행되며 명령 줄을 처리하고 양식을 일반 텍스트로 표시합니다. 또한 프로세스 간 통신에 사용되는 레지스트리 키를 지울 것입니다 (아래 참조).

사실이면 프로세스 간 통신을 위해 사용될 특정 키의 명령 줄을 registry에 저장 한 다음 주 폼을 표시하지 않고 응용 프로그램을 종료합니다.

실행중인 응용 프로그램 (첫 번째 인스턴스)은 새 명령 줄이 예상되는 레지스트리 키를 정기적으로 검사하는 폴링 메커니즘 (매초마다 한 번씩 Windows 타이머를 실행할 수 있음)을 시작해야합니다. 일반적으로 빈 문자열을 찾고 아무 것도하지 않지만 검색된 값이 비어 있지 않으면 사용자가 다른 매개 변수 집합을 사용하여 응용 프로그램을 다시 생성한다는 것을 의미합니다. 그런 다음 명령 줄을 디코드하고 창을 다시 칠할 수 있습니다 필요에 따라 그런 다음 레지스트리 항목을 다시 지워야 폴링 메커니즘이 다시 시작되어 사용자가 다음에 응용 프로그램을 호출 할 때이를 감지합니다.

명명 된 파이프, WCF, .remoting 또는 TCP 소켓은 사용할 수 있고 폴링 메커니즘을 필요로하지 않을 수도있는 IPC 메커니즘이며 일부는 이에 의해 훼손 될 수 있습니다. ;)

희망이 도움이됩니다!

+1

@HansPassant가 제출 한 링크는 제 대안보다 훨씬 더 (깨끗한) 솔루션을 의미합니다. 그것을보십시오. =) –

+0

시간을 내 질문과 답을 읽어 주셔서 감사합니다! – Griff

관련 문제