2015-11-20 7 views
5

Ich entwerfe eine Python-Anwendung, indem ich eine C++ - DLL aufruft. Ich habe meine Interaktion zwischen meiner DLL und Python 3.4 here gepostet. Aber jetzt muss ich einen Prozess im Streaming mit einem Threading-basierten Modell tun und meine Callback-Funktion sieht aus, um alle print s in eine Warteschlange zu setzen und nur wenn mein Streaming beendet ist, wird die gesamte Info gedruckt.Python 'print' in einem C++ basierten Threading-Modell

def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     out_list_item = cast(OutList[i], c_char_p).value 
     print("{}\t{}".format(ConList[i], out_list_item)) 
    return 0 

Ich habe versucht, die nächsten Möglichkeiten zu nutzen, aber alle von ihnen sehen in der gleichen Art und Weise zu arbeiten:

from threading import Lock 

print_lock = Lock() 
def save_print(*args, **kwargs): 
    with print_lock: 
    print (*args, **kwargs) 

def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     out_list_item = cast(OutList[i], c_char_p).value 
     save_print(out_list_item)) 
    return 0 

und:

import sys 
def callbackU(OutList, ConList, nB): 
    for i in range(nB): 
     a = cast(OutList[i], c_char_p).value 
     sys.stdout.write(a) 
     sys.stdout.flush() 
    return 0 

ich, dass mein Rückruf möchte Gibt die Nachricht aus, wenn sie aufgerufen wird, nicht wenn der gesamte Prozess beendet wird.

+0

Bitte überschreiben Sie Ihre Frage, wie in natürlicher Sprache, konnte ich nichts verstehen! –

+0

Ok, das liegt daran, dass ich kein Muttersprachler bin, aber könntest du meine andere Frage verstehen? oder Soll ich den anderen auch besser erklären? –

+1

OT: fast keiner liest "meine andere Frage" -Links, es ist viel besser, stattdessen anwendbare Zusammenfassung einzuschließen. Auf der anderen Seite ist die Verbindung zu bekannten Themen oder Ressourcen (z. B. Wiki: DAG oder Pypi: Cffi) willkommen. –

Antwort

2

Ich kann finden, was das Problem war, ich verwende einen Thread-basierten Prozess, der für eine unbestimmte Zeit bleiben muss, bevor es beendet wird. In C++ verwende ich getchar(), um zu warten, bis der Prozess beendet werden muss, dann, als ich die ENTER-Taste drückte, springt der Prozess zum freigebenden Teil. Ich habe auch versucht, sleep() s von 0,5 Sekunden in einem while zu verwenden, bis eine bestimmte Zeit vergangen ist, um zu prüfen, ob das mir helfen könnte, aber es tat es nicht. Beide Methoden funktionierten in meiner Python-Anwendung auf die gleiche Weise. Die Werte, die ich beim Streaming haben musste, wurden zuerst in eine Warteschlange gestellt, und wenn der Prozess nicht beendet wurde, wurden die Werte gedruckt.

Die Lösung bestand darin, zwei Funktionen zu machen, die erste für die Initialisierung des threadbasierten Modells. Und die letzte Funktion für beendet den Prozess. Auf diese Weise brauchte ich keine getchar() weder eine sleep(). Das funktioniert ganz gut für mich! Vielen Dank für Ihre Aufmerksamkeit!