2012-01-02 3 views
0

현재, 나는 버튼 푸양식 바 클릭되었는지 확인하기 위해 DoEvents를 호출합니다. 이 방법은 효과적이지만 너무 많은 처리 능력을 필요로하므로 프로그램이 지연됩니다.DoEvents를 사용하지 않고 단추를 눌렀는지 감지하는 방법?

나는 버튼 푸가 클릭 한 경우 난 단지 DoEvents가 통과하는 모든 다른 형태 대신에, 확인 할 수 있다면 지연이 감소 할 수 있다고 생각합니다.

어떻게 확인할 수 있습니까? 버튼 Foo을 클릭 했습니까?

+3

단추는 이벤트를 생성하며 해당 이벤트에 대한 처리기를 작성할 수 있습니다. DoEvents를 사용하는 경우 VB6 이벤트 처리에 대한 자세한 내용을 읽는 것이 좋습니다 (힌트 : DoEvents는 좋은 방법이 아닙니다). – jdigital

+0

당신이 극적으로 성능을 향상시킬 수있는 한 가지 방법은 100 회 루프마다 또는 일부 그러한 DoEvent 만 수행하는 것입니다. 이렇게하면 프로그램에서 UI 상호 작용을 처리하고 실적을 향상시킬 수 있습니다. – UnhandledExcepSean

+2

버튼의 이벤트 핸들러를 사용하면 효과가 작동하지 않는 이유를 먼저 설명하십시오. 우리가 코드 구조에 대해 더 많이 알고 있다면 같은 문제로 고통받지 않는 대체 스타일을 제안 할 수 있습니다. – tcarvin

답변

6

VB6은 사용자가하고있는 것처럼 보이지 않았습니다 (메시지 루프 제어를 위해 다시 돌아 가지 않는 일종의 장기 실행 코드). 일반적으로 이러한 작업은 작업자 스레드에 위임되며 VB6에서는 대부분의 경우 C++로 구현 된 일부 외부 구성 요소를 의미합니다.

만 접근의 매우 몇 가지가 있습니다 귀하의 임시 논리에 대해이 작업을 수행하기 위해 수행 :

  • 해킹은 여러 가지 이유로 VB6 매우 신뢰할 수 없습니다, API 호출을 통해 별도의 스레드를 생성.
  • 장시간 실행되는 작업 부하를 처리하기위한 클래스를 구현하는 까다로운 스레드 당 개체 ActiveX EXE.
  • 별도의 비 대화식 작업자 프로세스가 GUI 프로그램에 의해 실행되고 모니터됩니다.

꽤 많이 있습니다.

이런 종류의 작업을 수행하는 데 필요한 방법은 VB6 설명서에 설명되어 있습니다. 장시간 실행되는 루프를 깨고 논리를 반복 가능한 "퀀텀 (quantum)"작업 (예 : 처리 루프의 반복)으로 변환하고 양식 글로벌 데이터에서 작업 부하의 상태를 유지합니다. 그런 다음 타이머 컨트롤을 사용하여 간격을 1 또는 16으로 설정합니다 (거의 중요하지 않습니다. 일반적으로 트리거하려면 최소 16ms가 소요됩니다). 그리고 이벤트 처리기에서 작업량 퀀텀을 실행합니다.

그래서 현재 루프를 수행하여 현재 10 만회 반복하면 각 타이머 틱마다 500 회 실행되도록 해체 할 수 있습니다. 퀀텀 크기는 루프 내에서 수행되는 작업을 기반으로 조정해야 할 것입니다. 500은 설명을 위해 선택한 값입니다. 백그라운드 작업 부하를 너무 많이 소비하지 않고 (완료 속도를 늦추지 않고) UI가 응답 할 때까지이 값을 조정해야합니다.

1

코드가 무겁기 때문에 DoEvents을 호출하지 않거나 주기적으로 실행을 완료하면 앱에서 버튼을 눌렀다 고 알지 못합니다. DoEvents 전화는 창을 허용하고 응용 프로그램은 모든 알림을 따라 잡을 수 있습니다.

이 문제를 해결하는 올바른 방법은 작업자 스레드 (VB6에서 이와 비슷한 작업을 수행하는 방법은 this article 참조)이지만 정기적 인 DoEvents가 필요하며 차례로 호출에 대한 일부 재진입 차단이 장기 실행 코드.

관련 문제