가능한 회전"off"여러 GUI 실?(지 않은 중단에서 시스템 응용 프로그램.실행)

StackOverflow https://stackoverflow.com/questions/2872

  •  08-06-2019
  •  | 
  •  

문제

나의 목표는

하고 싶은 메인 처리를 스레드(비 GUI),및 수를 떨어져 회전시키는 Gui 에서 자신의 배경 쓰레드가 필요하고 내 주요 비 GUI 실 작업을 유지합니다.다른 방법을 넣어 나가려는 나의 주요 비 GUI-스레드 소유자의 GUI-thread 고 그 반대의 경우도 마찬가지입니다.나는 확실하지 않다이 가능한 윈도우 폼(?)

배경

나는 컴포넌트 기반의 시스템에서는 컨트롤러의 동적 부하 어셈블리와 인스턴스화하고 실행 클래스를 구현하는 일반적인 IComponent 인터페이스를 하나의 방법 DoStuff().

구성 요소를 가져오는 로드 구성을 통해 파일을 수정 및 추가하여 새로운 어셈블리가 포함된 다른 구현 IComponent.구성 요소가 제공하는 유틸리티 기능의 주요 응용 프로그램입니다.면서 주요 프로그램은 그것을 하의 것은,예를 들어,을 제어하는 원자력 발전소,구성 요소를 수행할 수 있습 유틸리티 작업(에서 자신의 스레드),예를 들어,클리닝 데이터베이스,이메일을 보내는,인쇄 재미있는 농담 프린터에서,당신은 무엇을.내가 좋아하는 것,하나 이러한 구성 요소의 수를 표시할 수 있는 GUI,예를 들어,상태 정보에 대해 말했다는 이메일을 보내 구성 요소입니다.

수명의 완전한 시스템은 다음과 같이

  1. 응용 프로그램을 시작합니다.
  2. 을 확인하기 위한 구성 파일 구성됩니다.로드니다.
  3. 각 구성 요소에 대한 실행 DoStuff() 을 초기화 하고 그것을 살고 그것의 자신의 삶에서 자신의 스레드입니다.
  4. 계속 할 주요 응용 프로그램-thingy 왕의 일을,영원합니다.

나는 아직 할 수 있었을 성공적으로 수행하는 포인트는 경우 3 구성 요소를 발생시키는 GUI 에 DoStuff().그것은 단순히 정지까지가 닫힙니다.지까지의 GUI 를 닫는 프로그램을 진행하는 포인트 4.

그것은 좋은 것입하는 경우 이러한 구성 요소를 시작할 수 있는 자신의 Windows Forms Gui.

문제

구성 요소하려고 불 GUI 에 DoStuff() (정확한 라인의 코드 구성 요소에서 실행 Application.Run(theForm)다),구성 요소 및 따라서 우리의 시스템 중에서 Application.Run() 라인까지가 닫힙니다.만,단지 해 GUI 으로 바로 예상된다.

를 들어의 구성 요소입니다.하지 함께 할 수 없 GUI 며,두 번째 화재까지 귀여운 윈도우와 분홍색 무성한 토끼에서 그들이다.

public class MyComponent1: IComponent
{
    public string DoStuff(...) { // write something to the database  }
}

public class MyComponent2: IComponent
{
    public void DoStuff()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());

        // I want the thread to immediately return after the GUI 
        // is fired up, so that my main thread can continue to work.
    }
}

내가 이것을 시도하고 있습니다.시도하는 경우에도 불 GUI 그것의 자신의 스레드를 실행을 정지할 때까지 GUI 으로 마감했다.

public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}

그것은 스 GUI 고 돌아 Application.Run()?

도움이 되었습니까?

해결책

응용 프로그램.실행 방법 중 하나를 표시합니다(또는 그 이상)의 형태를 시작하는 표준에 메시지가 반복까지 운행하는 모든 형태가 닫힙니다.할 수 없습니다 강제로 돌아에서는 방법을 제외하고 모두 닫 형태 또는 강제 응용 프로그램이 종료됩니다.

당신은 할 수 있습니다,그러나,전달 ApplicationContext (대신 새로운 형태())에 응용 프로그램.실행 방법 및 ApplicationContext 을 실행하는 데 사용할 수 있습니다 여러 가지 형태다.응용 프로그램이 종료할 때 사람들의 모든이 닫힙니다.는 여기를 참조하십시오: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

또한,어떤 양식을 보여주시는 것이 아닌 모달로 계속 실행하는과 함께 당신의 주요 양식을 사용할 수 있는 하나 이상의 윈도우는 블록하지 않습니다.저는 이것을 믿는 것은 실제로 당신이 시도하고 있는 무슨을 수행할 수 있습니다.

다른 팁

나는 확실히 이 가능하면 해킹에서 그것이 충분히 열심히,그러나 나는 것이 좋은 그것이 좋은 생각이 아니다.

'창'을(즉,당신은 화면에 표시)은 고도로 결합된 프로세스입니다.는 각 프로세스가 표시되는 어떤 GUI 것으로 예상된 메시지가 반복하는 프로세스의 모든 메시지는 참여로 만들고 관리하는 윈도우(는 것처럼'버튼을 클릭','닫힌 응용 프로그램','다시 그리기 화면'등이 있습니다.

이 때문에,그것은 더 많거나 적은 것으로 가정이 있는 경우 메시지가 반복 사용할 수 있어야 합니다 평생의 과정입니다.예를 들어 윈도우 보낼 수 있습니다 당신은'종'메시지,그리고 당신이 필요하는 메시지가 반복 사용할 수 있을 처리하는 경우에도 당신은 아무것도 없습니다.

당신의 최선의 방법입니다 그것을 다음과 같다:

들에게 보이는 형태로 표시되지 않는'주요 응용 프로그램' 시 전화 응용 프로그램.실행 및 통과에서 이 가짜 양식입니다.귀하의 작업에서 다른 스레드 및 이벤트를 발생에 주요 스레드가 필요할 때 할 Gui 물건입니다.

나는 확실하지 않으면 이것은 바로,그러나 내가 기억 실행 창에서 양식 콘솔 프로그램에 의해 다만 newing 양식 호출 newForm.Show()경우에,당신의 구성 요소에서 사용하는 대신 응용 프로그램입니다.Run()새로운 형태는 안됩니다.

물론 구성 요소가 될 것이 책임에 대한 참조를 유지 관리하는 양식 작성

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top