2013-04-03 39 views
5

我想每分钟向变量添加1而不干扰已运行的代码。如何在Python中每分钟发生一次动作

这是一个游戏,所以我想在背景中为木+ 1,摇滚+ 1,鱼+1发生每分钟没有用户知道。

time.sleep在这种情况下不起作用,因为它暂停了整个程序。

start=time.time() 
#some code 
end=time.time() 
if end-start > 60: 
    wood = wood+1 
    rock = rock+1 

我试着做了上面的事情,但无法让它连续计数。它只测量#some代码执行需要多长时间。

任何帮助将是伟大的!提前致谢。

+0

相关:[?setInterval的Python的当量()](http://stackoverflow.com/q/2697039/4279) – jfs 2014-03-20 09:54:08

回答

7

您需要导入线程模块和itertools(除svks' comment)在python

import thread, time, itertools 

初始化线程计数器像

wood = itertools.count().next() 

,写你的计数器更新成功能

def updateCounter(): 
    while True: 
     wood.next() 
     # wood += 1 
     time.sleep(60) 

,并启动新的线程与

thread.start_new_thread(updateCounter,()) 

但像的的ressource变量必须accessable从计数器功能中!

+0

你可能使资源全局,但全局始终是一个坏主意。 – 2013-04-03 18:53:31

+0

这不是线程安全的(x + = 1不是原子性的:http://29a.ch/2009/2/20/atomic-get-and-increment-in-python)。如果你这样做了,而你在游戏的其他地方做了木 - = 100,你可能偶尔会发现其中一个变化神秘地失去了。 – svk 2013-04-03 18:53:31

+1

公平点。我会编辑! – thomas 2013-04-03 19:01:35

1

为此,您需要单独的线程来负责递增计数器。但请记住,将线程引入任何程序会使其更加复杂。详情请参阅threading docs

此外,您不确定特定的线程会每秒钟处理器的时间,您可以假设,但您不确定。

5

下面是一个不涉及线程的答案,因为线程可能会很棘手以便正确使用。 (如果你使用线程你需要阅读线程之间的同步,或者你可能冒险运行到微妙的错误。)

你可能有某种“主循环”。也许它看起来是这样的,目前:

while game.running: 
    game.process() 

有什么魔力主循环 - 你可以做的事情,除了在这里处理输入和绘画到屏幕上。如果您使用的是可能你的主循环隐藏在库中某些库

t0 = time.time() 
while game.running: 
    t1 = time.time() 
    if (t1-t0) >= 60.0: 
     game.wood += 1 
     t0 = t1 
    game.process() 

:如果你想要的东西为每分钟运行一次,你可以简单地做这样的事情。在这种情况下,你可能开始你的游戏或多或少是这样的:

game.main() # this function doesn't return until your game exits 

如果是这样的话,很可能会在你的图书馆做一些相当于上面的功能 - 设置代码每隔一段时间或按指定的时间间隔执行一次。寻找“空闲功能”或“定时器”。

1

它将每60秒运行一次。

 try { 
     while (true) { 
      System.out.println(new Date()); 
      Thread.sleep(60 * 1000); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
+0

Java不是Python – jfs 2014-03-20 09:56:29

+0

yes..but你可以在Python中创建相同的逻辑。 ! 我只是给你逻辑...! – 2014-03-20 18:52:54

+0

在这种情况下,它是[@ tomaszbrue的答案](http://stackoverflow.com/a/15795496/4279) – jfs 2014-03-20 19:01:57

相关问题