2010-05-18 4 views
0

VS 2005로 작성된 Windows 응용 프로그램이 있습니다.이 응용 프로그램은 매 2 분마다 타이머 주기로 SQL 데이터베이스에 대해 쿼리를 만듭니다. 데이터가 변경되면 새 데이터로 창이 새로 고쳐집니다.어쨌든 현재 Windows가 잠금 모드인지 확인하려면?

사용자가 창을 나가면 잠시 후 창이 자동으로 잠 깁니다. 창문이 잠겨있을 때 2 분 안에 데이터를 계속 조회하는 것은 의미가 없습니다. 따라서 네트워크 데이터 트래픽을 줄이고 메모리 및 CPU와 같은 현재 Windows 리소스를 저장하도록 잠금이 설정되어있을 때 쿼리를 중지하고 싶습니다.

현재 창이 잠겨 있는지 확인하는 방법이 있는지 확실하지 않습니까? 닷넷 클래스가 없다면이 목적을위한 Windows API가 있는지 확실하지 않은가요?

내 프로젝트는 .Net 2.0이고 모든 사용자는 Windows XP에 있습니다. 윈도우가 다른 윈도우를 최소화하거나 적용하면 데이터를 새로 고침 아무 소용이 없다 -

답변

1

당신은 실제로 창 잠겨 있는지 여부를 조회 할 않는 대신 무엇을 조회 할 것은 응용 프로그램이 볼 수 여부입니다 어느 쪽 이죠?

이 문제를 해결하는 표준 방법은 타이머를 사용하고 창을 무효화하는 것입니다. the Timer class을 사용하여 2 분 후에 타이머를 예약하십시오. 타이머가 발생하면 Form.Invalidate()을 통해 창을 무효화합니다.

창을 무효화하면 Windows에서 해당 창에 "페인트"메시지를 보냅니다. OnPaint 처리기에서 데이터로 화면을 업데이트합니다. 하지만 여기에 키커가 있습니다. 창이 보이지 않으면 Windows 은 이벤트 (화면이 현재 잠겨있는 경우 포함)을 실행하지 않습니다!

이제 데이터베이스 쿼리가 OnPaint 이벤트 핸들러에서 실행하기에는 너무 비싸므로 타이머 처리기에서 약간의 작업을해야 할 수도 있습니다. 예를 들어 타이머 처리기에서 데이터베이스 쿼리를 수행하고 을 입력 한 다음Form.Invalidate()으로 호출 할 수 있습니다. 즉, 화면 잠금에서 돌아 왔을 때 데이터가 오래된 것일 수 있으므로 DateTime.Now이 타이머 처리기와 OnPaint 처리기간에 크게 다른지 여부를 확인하고 다른 타이머를 곧바로 예약 할 수 있습니다. . 그렇지 않은 경우 OnPaint 콜백에서 2 분 후에 타이머가 다시 실행되도록 예약하십시오.

나는 모두 의미가 있기를 바랍니다.

+0

선언해야 할 API가 많이 있습니다. 사용할 수있는 래퍼 클래스가 있는지 확실하지 않은 경우 –

+0

내가 아는 것은 아닙니다. 사실, 실제로는 꽤 간단합니다. 내 설명은 아마도 더 복잡해질 것입니다. :) –

+0

죄송합니다.이 문제를 늦게 드려 죄송합니다. 이제 나는 다시 이것으로 돌아 간다. 설명에 따라, 내가 할 수있는 일은 이벤트 입구에서 타이머를 사용하지 않도록 설정하고 다음에 데이터베이스 쿼리를 수행하는 것입니다. 쿼리가 완료되면 this.Invalidate()를 호출합니다. 타이머는 OnPaint()를 재정의 할 때만 활성화됩니다. 나는 올바른 길을 가고 있는가? –

관련 문제