2015-11-20 6 views
5

मैं सी ++ डीएलएल को कॉल करके एक पायथन ऐप डिज़ाइन कर रहा हूं, मैंने अपने डीएलएल और पायथन 3.4 here के बीच अपनी बातचीत पोस्ट की है। लेकिन अब मुझे थ्रेडिंग आधारित मॉडल को शामिल करने में स्ट्रीमिंग में कुछ प्रक्रिया करने की ज़रूरत है और मेरा कॉलबैक फ़ंक्शन सभी print एस कतार में डालने लगता है और केवल जब मेरी स्ट्रीमिंग समाप्त हो जाती है, तो सभी जानकारी मुद्रित होती है।एक सी ++ आधारित थ्रेडिंग मॉडल में पायथन 'प्रिंट'

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 

मैं अगले तरीके का उपयोग करने की कोशिश की है, लेकिन उन सभी को एक ही तरीके से काम करने के लिए लग रहा है:

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 

और:

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 

मुझे लगता है कि चाहते हैं मेरी कॉलबैक जब इसे कहा जाता है तो उसका संदेश प्रिंट करता है, न कि जब पूरी प्रक्रिया समाप्त होती है।

+0

कृपया अपने प्रश्न को दोबारा लिखें, जैसे कि प्राकृतिक भाषा में, मैं कुछ समझ नहीं पाया! –

+0

ठीक है, ऐसा इसलिए है क्योंकि मैं मूल निवासी नहीं हूं, लेकिन क्या आप मेरा अन्य प्रश्न समझ सकते हैं? या क्या मुझे दूसरे को भी बेहतर समझा जाना चाहिए? –

+1

ओटी: लगभग कोई भी "मेरा अन्य प्रश्न" लिंक नहीं पढ़ता है, इसके बजाय लागू सारांश शामिल करना बेहतर है। दूसरी तरफ, जाने-माने विषयों या संसाधनों (जैसे विकी: डीएजी, या पीपीआई: सीएफआई) से जुड़ना स्वागत है। –

उत्तर

2

मुझे पता चल सकता है कि समस्या क्या थी, मैं थ्रेड आधारित प्रक्रिया का उपयोग कर रहा हूं जिसे इसे समाप्त होने से पहले अनिश्चितकालीन समय तक रहने की आवश्यकता है। सी ++ में मैं प्रक्रिया को समाप्त होने तक प्रतीक्षा करने के लिए getchar() का उपयोग कर रहा हूं, फिर जब मैंने एंटर बटन दबाया तो प्रक्रिया रिलीज़िंग भाग पर कूद गई। मैंने एस while में 0 सेकंडएस का उपयोग करने की भी कोशिश की, जब तक कि यह मेरी मदद कर सके, लेकिन यह नहीं किया गया था, लेकिन परीक्षण नहीं किया गया था। दोनों पायदान मेरे पायथन एप्लिकेशन में उसी तरह काम करते थे, स्ट्रीमिंग में जो मूल्यों की आवश्यकता होती थी उन्हें पहले कतार में रखा गया था और जब तक प्रक्रिया समाप्त नहीं हुई थी कि मान मुद्रित किए गए थे।

समाधान दो कार्यों को बनाना था, पूर्व में थ्रेड आधारित मॉडल को प्रारंभ करने के लिए। और प्रक्रिया समाप्त होने के लिए अंतिम एक समारोह। ऐसा करने से मुझे getchar() की आवश्यकता नहीं थी और न ही sleep()। यह मेरे लिए बहुत अच्छा काम करता है !, आपका ध्यान धन्यवाद!

संबंधित मुद्दे