2015-02-05 95 views
1

以下代碼片段來自python撲克服務器。該程序除了在使用reactor.callLater時試圖延遲遊戲開始時的作用。Python扭曲,reactor.callLater()不推遲

變量「wait」從具有「60」設置的xml文件中獲取其整數。然而延遲從未實現,比賽總是立即開始。我不是很熟悉python,或者只是試圖破解這個爲我工作。但是從我的角度來看,有一點似乎是它不應該工作,因爲我無法看到變量「old_state」如何以及在何處獲得它的值,以便代碼正確地確定服務器的狀態。但也許我錯了。

我希望熟悉python和twisted的人能夠看到問題的癥結所在,並願意在這個問題上給我啓發。

elif old_state == TOURNAMENT_STATE_REGISTERING and new_state == TOURNAMENT_STATE_RUNNING: 
    self.databaseEvent(event = PacketPokerMonitorEvent.TOURNEY_START, param1 = tourney.serial)    
    reactor.callLater(0.01, self.tourneyBroadcastStart, tourney.serial) 
    # Only obey extra_wait_tourney_start if we had been registering and are now running, 
    # since we only want this behavior before the first deal. 
    wait = int(self.delays.get('extra_wait_tourney_start', 0)) 
    if wait > 0: 
     reactor.callLater(wait, self.tourneyDeal, tourney) 
    else: 
     self.tourneyDeal(tourney) 

作爲參考,我已經放置了與問題相關的大部分代碼。

def spawnTourneyInCore(self, tourney_map, tourney_serial, schedule_serial, currency_serial, prize_currency): 
    tourney_map['start_time'] = int(tourney_map['start_time']) 
    if tourney_map['sit_n_go'] == 'y': 
     tourney_map['register_time'] = int(seconds()) - 1 
    else: 
     tourney_map['register_time'] = int(tourney_map.get('register_time', 0)) 
    tourney = PokerTournament(dirs = self.dirs, **tourney_map) 
    tourney.serial = tourney_serial 
    tourney.verbose = self.verbose 
    tourney.schedule_serial = schedule_serial 
    tourney.currency_serial = currency_serial 
    tourney.prize_currency = prize_currency 
    tourney.bailor_serial = tourney_map['bailor_serial'] 
    tourney.player_timeout = int(tourney_map['player_timeout']) 
    tourney.via_satellite = int(tourney_map['via_satellite']) 
    tourney.satellite_of = int(tourney_map['satellite_of']) 
    tourney.satellite_of, reason = self.tourneySatelliteLookup(tourney) 
    tourney.satellite_player_count = int(tourney_map['satellite_player_count']) 
    tourney.satellite_registrations = [] 
    tourney.callback_new_state = self.tourneyNewState 
    tourney.callback_create_game = self.tourneyCreateTable 
    tourney.callback_game_filled = self.tourneyGameFilled 
    tourney.callback_destroy_game = self.tourneyDestroyGame 
    tourney.callback_move_player = self.tourneyMovePlayer 
    tourney.callback_remove_player = self.tourneyRemovePlayer 
    tourney.callback_cancel = self.tourneyCancel 
    if not self.schedule2tourneys.has_key(schedule_serial): 
     self.schedule2tourneys[schedule_serial] = [] 
    self.schedule2tourneys[schedule_serial].append(tourney) 
    self.tourneys[tourney.serial] = tourney 
    return tourney 

def deleteTourney(self, tourney): 
    if self.verbose > 2: 
     self.message("deleteTourney: %d" % tourney.serial) 
    self.schedule2tourneys[tourney.schedule_serial].remove(tourney) 
    if len(self.schedule2tourneys[tourney.schedule_serial]) <= 0: 
     del self.schedule2tourneys[tourney.schedule_serial] 
    del self.tourneys[tourney.serial] 

def tourneyResumeAndDeal(self, tourney): 
    self.tourneyBreakResume(tourney) 
    self.tourneyDeal(tourney) 

def tourneyNewState(self, tourney, old_state, new_state): 
    cursor = self.db.cursor() 
    updates = [ "state = '" + new_state + "'" ] 
    if old_state != TOURNAMENT_STATE_BREAK and new_state == TOURNAMENT_STATE_RUNNING: 
     updates.append("start_time = %d" % tourney.start_time) 
    sql = "update tourneys set " + ", ".join(updates) + " where serial = " + str(tourney.serial) 
    if self.verbose > 2: 
     self.message("tourneyNewState: " + sql) 
    cursor.execute(sql) 
    if cursor.rowcount != 1: 
     self.error("modified %d rows (expected 1): %s " % (cursor.rowcount, sql)) 
    cursor.close() 
    if new_state == TOURNAMENT_STATE_BREAK: 
     # When we are entering BREAK state for the first time, which 
     # should only occur here in the state change operation, we 
     # send the PacketPokerTableTourneyBreakBegin. Note that this 
     # code is here and not in tourneyBreakCheck() because that 
     # function is called over and over again, until the break 
     # finishes. Note that tourneyBreakCheck() also sends a 
     # PacketPokerGameMessage() with the time remaining, too. 
     secsLeft = tourney.remainingBreakSeconds() 
     if secsLeft == None: 
      # eek, should I really be digging down into tourney's 
      # member variables in this next assignment? 
      secsLeft = tourney.breaks_duration 
     resumeTime = seconds() + secsLeft 
     for gameId in map(lambda game: game.id, tourney.games): 
      table = self.getTable(gameId) 
      table.broadcast(PacketPokerTableTourneyBreakBegin(game_id = gameId, resume_time = resumeTime)) 
     self.tourneyBreakCheck(tourney) 
    elif old_state == TOURNAMENT_STATE_BREAK and new_state == TOURNAMENT_STATE_RUNNING: 
     wait = int(self.delays.get('extra_wait_tourney_break', 0)) 
     if wait > 0: 
      reactor.callLater(wait, self.tourneyResumeAndDeal, tourney) 
     else: 
      self.tourneyResumeAndDeal(tourney) 
    elif old_state == TOURNAMENT_STATE_REGISTERING and new_state == TOURNAMENT_STATE_RUNNING: 
     self.databaseEvent(event = PacketPokerMonitorEvent.TOURNEY_START, param1 = tourney.serial)    
     reactor.callLater(0.01, self.tourneyBroadcastStart, tourney.serial) 
     # Only obey extra_wait_tourney_start if we had been registering and are now running, 
     # since we only want this behavior before the first deal. 
     wait = int(self.delays.get('extra_wait_tourney_start', 0)) 
     if wait > 0: 
      reactor.callLater(wait, self.tourneyDeal, tourney) 
     else: 
      self.tourneyDeal(tourney) 
    elif new_state == TOURNAMENT_STATE_RUNNING: 
     self.tourneyDeal(tourney) 
    elif new_state == TOURNAMENT_STATE_BREAK_WAIT: 
     self.tourneyBreakWait(tourney) 
+0

請嘗試將此問題簡化爲[簡單,自包含,正確的示例](http://sscce.org),以便潛在的答覆者可以運行您的代碼並查看發生了什麼。有很多潛在的問題可能導致這個問題,並且只有代碼段繼續存在,我只能猜測這些問題是什麼。 – Glyph 2015-02-07 01:46:36

回答

0

我發現這段代碼有幾個導入的文件在另一個目錄中,我沒有檢查。我也對這個代碼塊的目的做了一個錯誤的假設。我希望這個功能是任意的,並且延遲每個錦標賽n秒,但實際上它只有在玩家忘記了遊戲並且沒有出現的時候纔會實現延遲。一旦我查看了正確的文件,這些事實就變得清晰了。學過的知識。看看所有的進口!