2012-08-09 3 views
3

xbmc 용 발신자 번호 추가 기능으로 사용되는 매우 간단한 파이썬 스크립트를 작성했습니다 (주로 복사). 소켓을 닫을 때를 제외하고는 예상대로 작동합니다. 루프가 끝나도록 xbmc.abortRequested (XBMC 종료 중 알림)가 True로 설정되어 있음을 확인했습니다. 하지만 (멈추는 것처럼 보이지는 않습니다.) xbmc는 정리 중 약 5 초 후에 스크립트를 종료합니다. 이 비정상적인 종료 문제가 발생하지 않지만 제대로 끝내려면 스크립트 선호합니다. 내가 설정할 수 있거나 시간을 할애 할 수있는 다른 시간 초과가 있는지 알 수 없다. 어떤 도움을 주셔서 감사합니다.asyncore 소켓이 제대로 닫히지 않습니다.

더그

내 코드 :

import socket, threading, thread, sys, asyncore, xbmc, xbmcgui, xbmcaddon 
from time import * 
from string import * 

xbmc.log("YAC Listener: Starting") 
PORT = 10629 

class Server(asyncore.dispatcher): 
    def __init__(self, host, port): 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.bind((host, port)) 
     self.listen(1) 

    def handle_accept(self): 
     socket, address = self.accept() 
     ConnectionHandler(socket) 

    def handle_close(self): 
     self.close() 
     xbmc.log("YAC Listener: Closing Port") 

class ConnectionHandler(asyncore.dispatcher_with_send): 
    def handle_read(self): 
     self.buffer = self.recv(1024) 
     self.buffer = split(self.buffer[5:], "~") 
     self.close() 
     global data 
     if len(self.buffer) > 1: 
      name = self.buffer[0] 
      number = self.buffer[1] 
       xbmc.executebuiltin("XBMC.Notification("+name+","+number+",7000,special://home/addons/script.yaclistener/phone.png)") 
     else: 
      data = self.buffer 

s = Server('', PORT) 

while not xbmc.abortRequested: 
    asyncore.loop(timeout=1) 

s.close() 
sys.exit() 
xbmc.log("YAC Listener: Exiting") 

답변

1

"제한 시간"(대략 루프 단위로 간주 될 수 있습니다) 약간 다른 의미를 갖습니다.

그래서 최종 파일의 코드가 같아야 떨어지게 다음과 같은 :

... 
while not xbmc.abortRequested: 
    asyncore.loop(timeout=1, count=1) 

# this will try to close ALL current connections: 
asyncore.close_all() 
# this will give some time (up to 5 seconds) for things to settle down: 
asyncore.loop(timeout=1, count=5) 
sys.exit() 
xbmc.log("YAC Listener: Exiting") 
관련 문제