2010-04-15 5 views
1

케이 3.0에서는 주로 단일 스레드 창 양식 응용 프로그램을보고 있습니다. 최근에 내 상사는 별도의 스레드에 진행 대화 상자를 추가하여 주 스레드가 사라졌을 때 사용자가 일부 작업을 볼 수 있도록하고 작업을 수행하고 GUI를 잠급니다.C# 스레드 간 대화 협력

위의 내용은 사용자가 응용 프로그램을 전환하거나 진행률 양식이 가장 위에 표시되고 주 응용 프로그램과 함께 사라지지 않으므로 최소화하지 않으면 정상적으로 작동합니다. 메인 폼의 이벤트 구조가 이벤트를 잡아서 시간이 지나면 최소화되고 활성화 된 플래그를 검사 할 수 있고 따라서 대화 상자 스레드가 숨김 또는 표시 될 수 있기 때문에 이것은별로 좋지 않습니다.

그러나 장기 실행 SQL 조작이 실행되면 이벤트가 실행되지 않습니다. WndProc 명령을 가로 채려고 시도했지만 장기 실행 SQL 조작이 실행 중일 때도 대기중인 것으로 표시됩니다. 나는 또한 현재의 응용 프로그램을 찾고 프로세스를 집어 들고 다양한 메모리 값을 isiconic 및 진도 스레드 내부 같은 확인하지만 SQL 작업이 끝날 때까지 이들 중 아무도 업데이트 얻을. 최상위를 제거하면 다른 앱이 활성화 될 때 대화 상자가 사라지지만 주 앱을 다시 가져 오면 다시 나타나지 않습니다.

다른 스레드가 최소화되었거나 SQL 작업이 완료 될 때까지 실제 스레드를 쿼리하는 것을 포함하지 않는 더 이상 활성 상태가 아닌지 확인하는 방법이 필요합니다.

이제는 이것을 쓰는 것이 가장 좋은 방법이 아니라는 사실을 알고 있습니다. GUI를 무료로 두는 별도의 스레드에서 많은 처리를하는 것이 좋지만 거대한 고대 유산의 앱이므로 다시 작성해야합니다. 그런 식으로 제공되지 않을 것이므로 내가 갖고있는 것과 함께 일해야합니다.

어떤 도움을

답변

0

장기 실행 작업이 진행 대화 상자에 바인딩 된 것처럼 소리를 감사? 그것은 대개 나쁜 생각이며 진전이 전혀 보이지 않을지 궁금합니다.
그러나 오랫동안 실행되는 작업에는 BackgroundWorker을 사용해야합니다. 따라서 GUI (메인 폼과 진행 대화 상자가 그대로 유지됩니다).
기본 양식의 최소화 이벤트를 즉시 대화 할 수있는 진행 대화 상자로 보낼 수 있어야합니다.

btw. BackgroundWorker은 자체적으로 진행률 보고서를 지원합니다.

+0

GUI가 이전 버전에서 발생했을 때 GUI가 잠겨있어서 진행 대화 상자가 표시되어 사용자에게 무언가가 진행되고 있음을 보여주는 무언가를 제공하기 위해 오래 실행되는 op가 주 스레드 (그리고 공식적으로 유일한 스레드였습니다)에서 실행됩니다 앱이 추락 한 것이 아닙니다. 얼굴에 대해 엉덩이하지만이 모든 일이 발생했습니다. –

관련 문제