2010-05-05 3 views
1

GUI 코드에 이상한 동작이 있습니다. 사용자가 짧은 시간에 많은 이벤트를 생성하면 실행중인 이벤트 핸들러 메소드가 다른 이벤트 핸들러 메소드에 의해 인터럽트되는 경우가 발생합니다. 모든 것이 동일한 스레드 (GUI 스레드)에서 실행되기 때문에 모든 것이 순차적으로 실행되어야하고 중단이 가능해서는 안되며, 아니면 내가 잘못 이해합니까? 귀하의 조언에 대한GUI 이벤트가 GUI 스레드의 코드 실행을 중단하여 자체 이벤트 처리 메소드를 실행할 수 있습니까?

감사합니다, ENY

+0

이러한 이벤트의 샘플은 무엇입니까? 예를 들어 Timer 이벤트에 대해 이야기하지 않아도됩니까? –

+1

맞습니다. GUI 스레드는 일을 순차적으로 실행해야합니다. 이러한 중단이 일어나고 있음을 어떻게 알 수 있습니까? – Paolo

+0

@Benjamin 아무런 타이머가 필요 없습니다. 이미 체크했는데, 실제로는 같은 스레드에 있습니다. 이벤트는 예를 들어 포커스 노드가 트리 목록 컨트롤에서 변경되었습니다. @Paolo 나는 무슨 일이 일어나는지를 기록하고있다. 스레드 정보 등. 그리고 순차적으로 실행되는 경우에는 발생할 수없는 잘못된 응용 프로그램 상태가 발생합니다. – Enyra

답변

4

아니, 그런 일이 없습니다. 스레드가 순차적으로 실행된다는 것을 잘 알고 있습니다.

GUI 스레드는 인터럽트 될 수 있지만 다른 스레드 만 실행하면 GUI 스레드를 다시 입력하여 다른 이벤트를 처리하지 않습니다. 스레드는 하나의 명령 포인터 만 가지고 있으므로 코드의 한 위치에만있을 수 있습니다. 스레드 자체는 인터럽트 할 수 없습니다.

GUI 스레드가 다시 입력되는 것처럼 보이는 것이 발생하는 경우 이유는 다른 것입니다.

그러나 GUI thead는 Application.DoEvents 메서드를 호출하여 "인터럽트"할 수 있습니다.

+0

Application.DoEvents는 좋은 힌트입니다.이 코드가 어딘가에서 사용된다면 코드를 검색해야합니다. – Enyra

+0

예, 감사했습니다. – Enyra

3

올바른지, 단일 스레드 응용 프로그램에서 이벤트를 순차적으로 실행해야합니다. 몇 가지 예외가 있습니다.

  1. 이벤트가 시작되고 구독자 목록의 첫 번째 이벤트 처리기를 호출합니다. 이벤트 핸들러는 다른 이벤트 핸들러를 호출하는 자체 이벤트를 발생시킵니다. 이 경우 이벤트가 중단 된 것처럼 보이지만 그렇지 않습니다. 원래 이벤트 핸들러가 완료되면 목록의 다음 이벤트 핸들러가 호출됩니다.

  2. 이벤트 처리기는 Application.DoEvents() 메서드를 호출합니다. 그러면 현재 이벤트가 일시 중단되고 메시지 큐에서 대기중인 모든 메시지가 처리됩니다 (일반적으로 자체 이벤트가 실행 됨). 모든 메시지 처리가 완료되면 이벤트로 돌아갑니다. Application.DoEvents()이 처리 한 메시지 중 하나에서 이벤트를 실행 한 결과 호출 된 이벤트에 대해 재귀 호출이 발생할 때 문제가 발생할 수 있습니다.

  3. 이벤트 처리기가 다른 스레드에서 실행될 수 있습니다. 일부 이벤트는 UI 스레드에서 시작되지 않으며 자체 스레드에서 시작될 수 있습니다. 이로 인해 이벤트가 순서대로 실행되지 않고 스레드 컨텍스트 스위치에서 서로 인터럽트 될 수 있습니다. UI 스레드에서 소비하는 이벤트가 발생하는지 확인하고 그렇지 않은 경우 Control.Invoke() UI 스레드에 이벤트가 발생하는지 확인하십시오. 사용자가 알지 못하는 별도의 스레드에서 실행되는 이벤트의 예는 System.Threading.Timer.Elapsed 이벤트입니다.

+0

다른 스레드를 생성 할 수있는 시간이나 다른 것이 없으며 동일한 스레드 내에서 실제로 이벤트 핸들러가 수동으로 호출된다는 것을 이미 확인합니다. 하지만 Application.DoEvents가 가능할 수도 있습니다. 지금 확인하겠습니다. – Enyra