문제

유지 GUI 반응하는 동안 이 응용 프로그램 일부 CPU 무거운 처리하는 과제 중 하나의 효과적인 GUI 프로그래밍입니다.

여기에는 좋은 토론 의에서 이를 수행하는 방법을 wxPython.요약,3 가지 방법이 있습니다:

  1. 스레드를 사용
  2. 사용 wxYield
  3. 덩어리의 작업을 수행하고 그것에 유휴 상태 처리기 이벤트

는 방법 당신 발견하는 가장 효과적인가?기술로서 다른 프레임워크을(Qt,사용자 인터페이스 그리고 또는 Windows API)도 환영합니다.

도움이 되었습니까?

해결책

스레드. 당신이 필요한 모든 프레임 워크에서 할 수 있기 때문에 그들은 항상 내가 찾는 것입니다.

그리고 한 언어/프레임 워크에서 멀티 스레딩 및 병렬 처리에 익숙해지면 모든 프레임 워크에 좋습니다.

다른 팁

확실히 스레드입니다.왜?미래는 멀티 코어.거의 모든 새로운 CPU 에는 하나 이상의 코어 또는다면 그것은 단지 하나 그것을 지원할 수 있습니다 하이퍼 스레딩 및 따라서 그것은 더 이상 하나입니다.을 효과적으로 이용하 multi-core Cpu(및 인텔은 기획까지 이동하기 32 개의 코어에서 지금까지 미래),야 할 여러 개의 스레드입니다.실행하면 모두 하나의 메인 스레드(일반적으로 UI 스레드는 메인 스레드),사용자가 사용하는 Cpu 가 8,16,하루 32 코어와 응용 프로그램을 사용하지 않 하나 이상의 이러한 IOW 그것을 실행되는 많은,많은 것보다 느리게를 실행할 수 있습니다.

실제 계획인 경우 응용 프로그램 요즘,나는 멀리의 고아한 디자인의 생각에 마스터/슬레이브 관계입니다.UI 마스터,그것은 단지의 작업은 사용자와 상호 작용이 가능합니다.를 표시하는 사용자에게 데이터를 수집 및 사용자 입력이 있습니다.때마다 당신이 필요하"프로세스는 모든 데이터"(심지어 작은 양하고 훨씬 더 중요한 큰 것),create a""작업의 모든 종류,앞으로 이 작업은 백그라운드 스레드 및 스레드 작업을 수행,피드백 제공하 UI(예:얼마나 많은 퍼센트를 완료했거나면 작업은 여전히 실행하거나지 않도록 UI 보여줄 수 있는"작업 진행 표시기").는 경우,가능한 분할 작업으로 많은 작은 독립적인 하위 작업 및 실행은 더 이상 하나의 배경이 과정을 먹이,하나의 서브 작업됩니다.는 방법의 응용 프로그램에게 큰 유익을 가져다 줄 수 있습니다 multi-core 과를 빠르게 얻을 더 코어 Cpu 니다.

실제로 회사는 다음과 같이 애플과 마이크로소프트는 이미 기획하는 방법에 그들은 여전히 대부분의 스레드 Ui 를 자신이 다중 스레드.심지어 상기의 접근할 수 있거나 상황 UI 병목 현상이다.백그라운드 프로세스할 수 있는 프로세스는 데이터보다 훨씬 더 빠르 UI 를 표시할 수 있습니다 또는 사용자 요구에 대한 사용자 입력이 있습니다.오늘날 많은 UI 프레임워크에 있는 작은 스레드에 안전하다,많은지 않는 스레드에 안전하는 모든하지만,변경됩니다.직렬처리(하나의 작업한 후 다른)은 죽어 디자인,병렬처리(하는 많은 작업을 한 번에)에서는 미래 갑니다.그냥 그래픽 어댑터가 있습니다.도 가장 현대적인 NVidia 카드에는 불쌍한 성능을 살펴보면 처리 속도에 MHz/GHz 의 GPU 를 혼자입니다.어떻게 그것을 이길 수 있는 쓰레기 Cpu 때 3D 계산?간단하다:대신 계산나 다각형의 지점 또는 하나의 질감을 픽셀 다른 후,계산은 많은 그들의 병렬(실제로는 무리에 같은 시간)및 그 방법에 도달 처리는 여전히 만드는 Cpu cry.E.g.ATI X1900(을 경쟁업체뿐만 아니라)48 셰이 유닛!

제 생각에는 delayedresult 당신이 찾고있는 것입니다 :

http://www.wxpython.org/docs/api/wx.lib.delayedresult-module.html

예를 들어 Wxpython 데모를 참조하십시오.

응용 프로그램에 따라 스레드 또는 프로세스. 때로는 GUI가 자체 프로그램 인 GUI를 갖는 것이 가장 좋습니다. 작업 할 때 다른 프로그램에 비동기 통화를 보내는 것이 가장 좋습니다. 결과를 모니터링하기 위해 GUI에 여러 스레드가있게되지만 작업이 복잡하고 GUI에 직접 연결되지 않으면 간단 할 수 있습니다.

스레드- 자를 사용한 간단한 2-layer 보기(GUI,응용 프로그램 논리).

응용 프로그램 논리를 작업을 수행해야에서 별도의 Python 스레드가 있습니다.을 위한 비동기적 이벤트는 필요가 전파하는 GUI 층을 사용하여 당신의 이벤트 시스템을 게시하는 사용자 정의 이벤트입니다.게시 wx 이벤트이 스레드에 안전한 그래서 당신은 형태로 저장되어 있습니다 그것에서 여러 상황.

작업에서 다른 방향으로(GUI 입력 이벤트 트리거 응용 프로그램 논리),내가 그것을 발견해 최선을 집-roll 사용자 정의 이벤트 시스템입니다.큐를 사용하 모듈 있는 스레드에 안전한 방법을 추진하고 터지는 이벤트 개체입니다.그 다음은 모든 동기는 멤버 함수,쌍으로 비동기 버전에는 동기화 기능을 개체 매개변수에 이벤트 큐가 있습니다.

이는 특히 잘 작동하는 경우에만 하나의 응용 프로그램 로직 레벨의 작업을 수행할 수 있습니다.의 혜택을 이 모델은 동기화가 간단-각 동기화 기능을 작동하에 그것의 자신의 컨텍스트에서 순차적으로 시작하의 걱정없이 끝날 pre-emption 또는 손으로 코딩한 항복.당신이 필요하지 않습니다 잠금 장치를 보호하는 중요한 섹션이 있습니다.의 끝에서 기능,이벤트를 게시하는 GUI 를 층을 나타내는 작업이 완료됩니다.

할 수 있는 규모이 허용하는 여러 응용 프로그램-레벨 쓰레드를 존재하지만,일반적인 문제와 동기화를 다시 나타납니다.

편집 -언급하는 것을 잊었의 아름다움이는 것이 가능하다는 것을 완전히 분리하려면 응용 프로그램 논리에서 GUI 코드입니다.모듈는 데 도움이 경우에 당신이 이제까지 사용하기로 결정한 다른 프레임 워크를 사용하거나 제공하는 명령줄 응용 프로그램의 버전입니다.이렇게하려면,당신은 당신이 필요로 할 것이 중간 이벤트 디스패처(레벨 응용 프로그램->GUI)에 의해 구현되는 GUI 층이다.

Win32의 경우 QT/C ++ 작업.

우리는 주요 작업 단위를 다른 프로세스로 나눕니다. GUI는 별도의 프로세스로 실행되며 필요에 따라 "작업자"프로세스에서 데이터를 명령/받을 수 있습니다. 오늘날 멀티 코어 세계에서 잘 작동합니다.

이 답변은 Python에 관한 OP의 질문에는 적용되지 않지만 메타 응답이 더 많습니다.

쉬운 방법은 스레드입니다. 그러나 모든 플랫폼에 선제 적 스레딩 (예 : Brew, 기타 임베디드 시스템)이있는 것은 아닙니다. 가능하면 단순히 작업을 중단하여 유휴 이벤트 핸들러에서 수행합니다.

Brew에서 스레드를 사용하는 데있어 또 다른 문제는 C ++ 스택 객체를 정리하지 않으므로 스레드를 죽일 때 메모리 누출이 너무 쉽다는 것입니다.

GUI의 메인 이벤트 루프가 차단하지 않도록 스레드를 사용합니다.

일부 형태의 작업을,별도의 프로세스를 사용하여 만드는 것은 매우 합리적인 솔루션입니다.하루에 다시,산란 프로세스 발생하는 많은 오버헤드가 발생합니다.현대적인 하드웨어를 이러한 오버헤드가 발생하지 않도 거의 글에서는 화면입니다.이것은 특히 사실 당신이란 긴 실행하는 과정입니다.

나(논쟁의 여지가)장점은 그것의 더 간단한 개념적 모형보다는 스레드로 이어질 수 있습 유지 관리 가능한 코드.그것은 또한 더 쉽게 코드를 테스트할 수 있으므로 작성 테스트를 스크립트는 운동 이러한 외부 프로세스하지 않고도를 포함합니다.일부를 수도라고 주장은 주요 장점이다.

의 경우에는 일부 코드 내가 한 일에,스위칭 스레드에서 별도의 프로세스를 주도하 net 의 감소를 통해 5000 라인의 코드를 동시에 만들기 GUI 더 응답 코드를 쉽게 유지하고 테스트하는 동안 모든 향상을 총 전반적인 성능을 개선합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top