इसी तरह का एक प्रश्न पहले भी पूछा गया था लेकिन इसने सही उत्तर नहीं दिया।

मैं पाइथन में थ्रेडिंग का परीक्षण करने के लिए कोड करने की कोशिश कर रहा हूं जिसमें एक टिकर हर सेकेंड टिकता है। मैं एक थ्रेड में चल रहे 'क्लिकिंग' नाम के टिकर फ़ंक्शन को रखने की कोशिश कर रहा हूं जिसका आउटपुट लगातार हर सेकेंड में बढ़ाया जा रहा है।

import time
import threading
import queue

q = queue.Queue()

apple = 0
orange = 0    
rate = 1
clix = 0


def clicking(clix, rate):
    while True:
        time.sleep(1)
        clix += rate
        q.put(clix)

threading.Thread(target=clicking, args=(clix, rate)).start()
curr = q.get()
print(curr)

print('\nClicker Starting...')
endgame = False
while not endgame:

    print(f'Clix: {curr}')
    print('1. Apple : 10 clix | 2. Orange : 8 clix  |  3. Exit')
    ch = int(input('\nPurchase ID: '))

    if ch == 1 and curr >= 10:
        print(f'You have {curr} clix.')
        print('Got an Apple!')
        apple += 1
        rate += 1.1
        curr -= 10

    elif ch == 2 and curr >= 8:
        print('Got an Orange!')
        orange += 1
        rate += 1.2
        curr -= 8

    elif ch == 3:
        endgame = True
        stopflag = True
    else:
        print('Need more Clix')

लेकिन मेरा ओटुपुट परिभाषित दर से हर सेकेंड में वृद्धि करने के बजाय हमेशा 1 होता है। मैं क्या खो रहा हूँ? मैंने q.put(clix) के स्थान पर return clix की भी कोशिश की लेकिन काम नहीं किया।

0
therion 24 सितंबर 2020, 13:07

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह है कि आप लूप के अंदर curr वेरिएबल को अपडेट नहीं कर रहे हैं। लेकिन ध्यान दें कि जब आप लूप के अंदर "curr = q.get ()" लिखते हैं तो उसे कतार में अगला मान मिलेगा न कि अंतिम मान (जैसा कि मुझे लगता है कि आप चाहते हैं)। मुझे लगता है कि time.time() का उपयोग करके अपने लूप के अंदर सेकेंड वृद्धि पर नज़र रखने के लिए एक और सरल दृष्टिकोण है।

import time

apple = 0
orange = 0
rate = 1
clix = 0
curr = 0

last_ts = time.time()

print('\nClicker Starting...')
endgame = False
while not endgame:
    ts = time.time()
    curr += (ts - last_ts) * rate
    last_ts = ts

    print(f'Clix: {curr:.0f}')
    print('1. Apple : 10 clix | 2. Orange : 8 clix  |  3. Exit')
    ch = int(input('\nPurchase ID: '))

    if ch == 1 and curr >= 10:
        print(f'You have {curr:.0f} clix.')
        print('Got an Apple!')
        apple += 1
        rate *= 1.1 # I guess you meant x1.1
        curr -= 10

    elif ch == 2 and curr >= 8:
        print('Got an Orange!')
        orange += 1
        rate *= 1.2 # I guess you meant x1.2
        curr -= 8

    elif ch == 3:
        endgame = True
        stopflag = True
    else:
        print('Need more Clix')

इस तरह आप ठीक से बाहर भी निकल सकते हैं, ध्यान दें कि आपके उदाहरण पर भी जब लूप टूट जाता है तब भी धागा जारी रहता है।

लेकिन अगर आप एक बैकग्राउंड थ्रेड को बनाए रखना चाहते हैं, तो मेरा सुझाव है कि मौजूदा काउंटर और रन कंडीशन के लिए एक क्लास बनाएं और क्लास वेरिएबल्स को स्टोर करें।

0
tatarana 6 अक्टूबर 2020, 22:08