2009-07-30 14 views
1

Ich programmiere eine einfache pyS60 App, nicht wirklich etwas mit Python oder die Verwendung mehrerer Threads vor, so das ist alles ein bisschen neu für mich. Um die App offen zu halten, setze ich einen e32.Ao_lock auf wait(), nachdem der Hauptteil der Anwendung initialisiert wurde, und signalisiere dann die Sperre für den exit_key_handler.Wie umgehen Sie das Problem mit dem Fehlen mehrerer ao.lock?

Eine der Aufgaben, die das Programm ausführen kann, ist das Öffnen einer Drittanbieter-App, UpCode. Dies scannt einen Barcode und kopiert die Barcode-Zeichenfolge in die Zwischenablage. Wenn ich den UpCode schließe, sollte meine Anwendung die Eingabe fortsetzen und die Eingabe aus der Zwischenablage einfügen. Ich weiß, dass dies mit Ao.lock erreicht werden kann, aber ich habe bereits eine Instanz von diesem aufgerufen. Im Idealfall wurde meine Anwendung wieder scharf, nachdem ich festgestellt hatte, dass etwas in die Zwischenablage eingefügt wurde. Kann ich mit einer der Schlaf- oder Timerfunktionen erreichen, was ich brauche?

Sie können das vollständige Skript finden here, und ich habe es auf die notwendigen Teile unter abgekürzt:

geschätzt
lock=e32.Ao_lock() 

# Quit the script 
def quit(): 
    lock.signal() 

# Callback function will be called when the requested service is complete. 
def launch_app_callback(trans_id, event_id, input_params): 
    if trans_id != appmanager_id and event_id != scriptext.EventCompleted: 
     print "Error in servicing the request" 
     print "Error code is: " + str(input_params["ReturnValue"]["ErrorCode"]) 
     if "ErrorMessage" in input_params["ReturnValue"]: 
      print "Error message is: " + input_params["ReturnValue"]["ErrorMessage"] 
    else: 
     print "\nWaiting for UpCode to close" 
    #lock.signal() 

# launch UpCode to scan barcode and get barcode from clipboard 
def scan_barcode(): 
    msg('Launching UpCode to scan barcode.\nPlease exit UpCode after the barcode has been copied to the clipboard') 
    # Load appmanage service 
    appmanager_handle = scriptext.load('Service.AppManager', 'IAppManager') 
    # Make a request to query the required information in asynchronous mode 
    appmanager_id = appmanager_handle.call('LaunchApp', {'ApplicationID': u's60uid://0x2000c83e'}, callback=launch_app_callback) 
    #lock.wait() 
    #print "Request complete!" 
    barcode = clipboard.Get() 
    return barcode 

# handle the selection made from the main body listbox 
def handle_selection(): 
    if (lb.current() == 0): 
     barcode = scan_barcode() 
    elif (lb.current() ==1): 
     barcode = clipboard.Get() 
    elif (lb.current() ==2): 
     barcode = input_barcode() 

    found = False 
    if is_barcode(barcode): 
     found, mbid, album, artist = identify_release(barcode) 
    else: 
     msg('Valid barcode not found. Please try again/ another method/ another CD') 
     return 

    if found: 
     go = appuifw.query(unicode('Found: ' + artist + ' - ' + album + '\nScrobble it?'), 'query') 
     if (go == 1): 
      now = datetime.datetime.utcnow() 
      scrobble_tracks(mbid, album, artist, now) 
     else: 
      appuifw.note(u'Scrobbling cancelled', 'info') 
    else: 
     appuifw.note(u'No match found for this barcode.', 'info') 

# Set the application body up 
appuifw.app.exit_key_handler = quit 
appuifw.app.title = u"ScanScrobbler" 
entries = [(u"Scan a barcode", u"Opens UpCode for scanning"), 
      (u"Submit barcode from clipboard", u"If you've already copied a barcode there"), 
      (u"Enter barcode by hand", u"Using numeric keypad") 
      ] 

lb = appuifw.Listbox(entries, handle_selection) 
appuifw.app.body = lb 

lock.wait() 

jede und alle Hilfe.

Antwort

0

Ich löste dieses Problem, indem ich eine separate zweite Sperre definierte und sicherstellte, dass immer nur eine auf mich wartete. Es scheint ohne Probleme zu funktionieren. Der aktuelle Code kann hosted on google code

gefunden werden