2010-02-09 2 views
1

숨 깁니다 "기다려주세요", 그래서 WAIT가 형성 제발 만든 나는이 같은 다른 스레드에서 호출폼 나는 내 응용 프로그램에 일부 긴 프로세스를 기본 폼

public void ShowWait() 
    { 
     continueWait = true; 
     ThreadPool.QueueUserWorkItem((x) => 
      { 
       using (frmWait espera = new frmWait()) 
       { 
        espera.ShowInTaskbar = false; 
        espera.Show(); 
        while (continueWait) 
         Application.DoEvents(); 
        espera.Close(); 
       } 
      }); 
    } 

그리고 양식을 닫습니다 내가 사용 : 대기에 양식이 표시 될 때

public void HideWait() 
    { 
     continueWait = false; 
    } 

그것은 잘 작동하지만 내가 문제가가, 기본 폼 손실 초점과 동시에 실행중인 다른 응용 프로그램 (엑셀, 워드, 등) 간다 상단으로 내 애플 리케이션은 모든 응용 프로그램의 뒷면에 간다. Activate() 및 Focus()를 사용하려고했지만 작업 표시 줄의 프레임 만 활성화되지만 응용 프로그램은 모든 응용 프로그램의 뒷면에 남아 있습니다.

여기에 표시되는 점 은요?

미리 감사드립니다.

+4

while 루프를 'HideWait' 메서드에서 신호를 보내는 Waithandle (예 :'ManualResetEvent')을 사용하여 바꾸는 것이 좋습니다. 그렇게하면 불필요한 CPU 리소스를 사용하지 않게됩니다. –

+0

수동 또는 자동 재설정 이벤트를 사용하면 응용 프로그램이 중단되고 대기 양식에 대기 애니메이션이 표시되지 않으며 전체 응용 프로그램이 신호를 기다립니다. – Argons

+0

이미 여러 번 여기에서이 문제를 해결했습니다. 다음을 확인하십시오. 1. http://stackoverflow.com/questions/2183520/backgroundworkers-never-stop-being-busy/2183963#2183963 2. http : // stackoverflow.com/questions/2152445/displaying-please-wait-message/2153082#2153082 – Oliver

답변

1

는 while 루프를 드롭 프레드릭의 제안과 관련,이 나를 위해 작동합니다

AutoResetEvent processing = new AutoResetEvent(false); 

private void HideWait() 
{ 
    processing.Set(); 
} 

private void ShowWait() 
{   
    ThreadPool.QueueUserWorkItem((x) => 
    { 
     using (frmWait espera = new frmWait()) 
     { 
      espera.ShowInTaskbar = false; 
      espera.Show(); 
      processing.WaitOne(); 
      espera.Close(); 
     } 
    }); 
} 

이 편집 :

메인을 방지하기 위해 양식을 잃고 초점 :

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

static readonly int SW_SHOWNOACTIVATE = 4; 

AutoResetEvent processing = new AutoResetEvent(false); 

private void HideWait() 
{ 
    processing.Set(); 
} 

private void ShowWait() 
{ 
    ThreadPool.QueueUserWorkItem(c => 
    { 
     using (frmWait espera = new frmWait()) 
     { 
      espera.ShowInTaskbar = false; 
      ShowWindow(espera.Handle, SW_SHOWNOACTIVATE); 
      processing.WaitOne(); 
      } 
     }); 
    } 
} 
+0

안녕하세요. 예를 들어 간단한 프로젝트가 필요합니다. 보내기 또는 링크를 통해 나를 도울 수 있습니까? 미리 감사드립니다. [email protected] – Zolfaghari

0

고객님의 문제를 올바르게 이해하시기 바랍니다. WaitForm을 항상 위에 놓고 싶습니까? 그렇다면

espera.TopMost = true; 

속성을 설정 했습니까?

+0

예 대기 양식이 올바르게 표시되는 속성을 설정했습니다. 문제는 기본 양식과 관련이 있습니다. – Argons

0

나는 당신이 모달 폼, 난 정말 당신이 그래서 내가 잘못 될 수 원하는 것을 이해하지

espera.ShowDialog(); 

OTOH을 시도하려는 생각합니다.

+0

대기 양식에는 TopMost = true가 있으므로 ShowDialog()가 필요하지 않습니다. – Argons

+0

대기열 양식을 닫으면 작업이 완료되면 기본 양식에 포커스가 주어지기 때문에 ShowDialog가 원하는 것일 수 있습니다. (내 생각 엔) –

+0

ShowDialog를 사용하려고했지만 대기 양식이 오른쪽 위 모서리로 이동했지만 여전히 기본 양식에 포커스가 없습니다. – Argons

1

코드 스 니펫이 문제를 재현하지 않습니다. 정말로 중요한 것은 메인 폼에 어떤 일이 일어나고 있는지입니다. 무슨 일이 일어나는지는 드문 일이 아닙니다. 대기 양식이 닫히면 Windows는 앱의 다른 창을 찾아서 포커스를줍니다. 하나를 찾을 수 없으면 다른 프로세스에서 다른 창을 선택하여 포 그라운드로 가져옵니다. 결과적으로 기본 양식이 해당 창 뒤에 사라집니다.

이것은 메인 폼이 비활성화되었을 때 발생합니다. Enabled 속성을 false로 설정했을 가능성이 있습니까? 주 양식이 여전히 Windows 메시지에 응답하지 않을 때도 발생할 수 있다고 생각합니다. 그 부분은 어둡습니다.

UI 스레드 대신 백그라운드 스레드에서 시간이 오래 걸리는 코드를 실행하여 이러한 종류의 문제 (및 대기 양식에 사용하는 잘못된 스레딩 아파트)를 피하십시오. BackgroundWorker는 그렇게 쉽게 설계되었습니다. 내가 다른 애플 리케이션은 상단에 갈하지만 재현 할 수없는

1

당신이 소유자 창을 받아 Show의 오버로드를 사용하여 시도하고 통과 했 그것에 대한 null 참조?나는 그런 식으로 해결 된 과거에 비슷한 문제를 경험 한 :

espera.Show(null); 

이 유형 Control에서 구현 Show()을 (호출의 동작에서 약간의 차이가있을 것 같다 그 단순히 Visible = true를 설정을하는 이 경우 Form 유형의 코드를 실행하고 Show(owner)을 호출하십시오.

관련 문제