2

友人が私が作成したGUIをテストしているときに、動作が遅いという苦情を受けました。案の定、Xpのパフォーマンスモニターを見ると、可能な限り多くのCPUを消費してワイドオープンで実行されます。スタックオーバーフローを掘り下げた後、これは通常の予想される動作のようです。

私の質問はこれです:プログラムが使用できるリソースの量を制限または抑制する方法はありますか?たくさんのプログラムを開いている間、パフォーマンスモニターを表示したままにしました。ほとんどの場合、すべての「プロフェッショナル」プログラム(フォトショップ、崇高なテキストなど)はすべて「アイドル」状態になっているようです。つまり、一度開始すると、最初のピークの後、CPU使用率はプロセッサのごく一部にまで減少します。

Pythonプログラムの使用を制限したり、(他のプログラムのように)必要なときにだけ電力を取得できるようにするにはどうすればよいですか?

私のメインループのわずかに切り捨てられたバージョン:

while True:
            events = pygame.event.get()
            for event in events:
                if event.type == QUIT:
                    if not flags['confirm']:
                        flags['alert'] = 1
                    else:
                        pygame.quit()

                elif event.type == MOUSEBUTTONDOWN:
                    text_box.set_focus(event.button, event.pos)
                    m_numbar.set_focus(event.button, event.pos)
                    # print event.pos 




            if not flags['window_open']:
                screen.blit(combined_bg, (0,0))
                t_button.update(events, screen)

            else:
                screen.blit(combined_blur, (0,0))

            if flags['config']:
                screen.blit(config_window_img, (0,0))
                text_box.update(events)
                text_box.draw(screen)
                m_numbar.update(events)
                m_numbar.draw(screen)
                submit.update(events, screen)
                cancel.update(events, screen)
                check_box.update(events, screen)
            else: 
                text_box.draw(screen)
                m_numbar.draw(screen)

            if flags['alert']:
                flags['window_open'] = True
                screen.blit(alert_dialog, (0,0))
                alert_cancel.update(events, screen)
                alert_confirm.update(events, screen)


            if flags['saving'][0]: 
                if time.time() - flags['saving'][1] < .75:
                    screen.blit(sav_img, (170,170))
                else:
                    flags['window_open'] = False
                    flags['saving'][0] = False


            if flags['currently_doing_thing']:
                if not flags['alert']: 
                    screen.blit(r_tag, (40,10))
                    if check_for_prog():
                        if not flags['prog_open']:
                            makeDir()
                            flags['prog_open'] = True
                            os.startfile("lla_.exe")
                    else:
                        flags['prog_open'] = False
                        if check_for_grab_process():
                            try:
                                os.system("TASKKILL /F /IM lla_.exe")
                            except:
                                pass




            config_button.update(events, screen)
            pygame.display.update()

GUIプログラミングに加えて、「通常の」タスクでCPUの使用を制限することは可能ですか?たとえば、while 1100%CPUで実行されます。このような単純なケースを抑制する方法はありますか?

4

2 に答える 2

3

Pygame を使用する場合、メイン ループは次のようになります ( Python Pygame Introductionから)。

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(ball, ballrect)
    pygame.display.flip()

pygame.event.get()ループの先頭にあるへの呼び出しに注意してください。他に何も起こらない通常の状況では、この関数は呼び出されるとブロックします。event.get()これは、CPU をまったく使用せずに、スクリプトが関数が戻るのを待つことを意味します。このevent.get()関数は、何か興味深い処理 (マウスの移動、キー押下など) がある場合にのみ戻ります。

あなたの問題の説明から、pygame.event.get()意図したとおりに使用していないと思われます。おそらく、メインループがどのように見えるかを示すことができます。

于 2012-05-24T00:52:18.730 に答える
0

GUI ループのアイドル コールバックは、(コールバック自体を介して、通常は false を返すことによって) 呼び出されないように明示的に指示されない限り、常に呼び出されます。ほとんどの場合は無効にしておき、実行が必要なイベントが発生した場合にのみ有効にします。

于 2012-05-24T00:40:07.460 に答える