2

当一个朋友在测试我制作的 gui 时,我收到了关于反应迟缓的投诉。果然,看看 Xp 的性能监视器,它运行时会消耗尽可能多的 CPU。在对stackoverflow进行了一些研究之后,这似乎是正常的预期行为。

我的问题是:有没有办法限制或限制程序允许使用的资源量?当我打开一堆程序时,我保持性能监视器可见,并且在大多数情况下,所有“专业”程序(如 photoshop、sublime text 等)似乎都处于“空闲”状态。也就是说,一旦启动,在初始峰值之后,它们的 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 1将以 100% cpu 运行。有没有办法限制这样的简单情况?

4

2 回答 2

3

使用 Pygame 时,您的主循环将如下所示(来自Python Pygame 简介):

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 回答