के बीच डेटा साझा करने का सबसे अच्छा तरीका क्या है, मैं PyQt4 के साथ अपना पहला जीयूआई एप्लीकेशन लिखने की प्रक्रिया में हूं और मैं एक प्रश्न पर आया हूं जो बहुत बुनियादी लगता है, फिर भी मुझे अच्छा जवाब नहीं दिख रहा है:पीईक्यूटी में, मुख्य विंडो और थ्रेड
मैं मुख्य विंडो को अवरुद्ध किए बिना लगातार दोहराए गए कार्य को करने के लिए थ्रेड का उपयोग कर रहा हूं। थ्रेड को मुख्य विंडो (जैसे स्पिनबॉक्स का वर्तमान मान) से कुछ जानकारी चाहिए जो थ्रेड के रनटाइम के दौरान भी बदल सकती है। इस स्थिति में, मुख्य विंडो और धागे के बीच इस तरह के डेटा साझा करने का सही तरीका क्या है?
भोलेपन से, मैं निम्नलिखित संभावनाओं के साथ आ सकता है:
- धागा के लिए मेजबान खिड़की के लिए एक संदर्भ में बताएं, और इस का उपयोग प्रश्न में चर (नीचे उदाहरण देखें) के वर्तमान मूल्य को पुनः प्राप्त करने।
- थ्रेड में चर की एक प्रति रखें और जब भी यह बदलता है सिग्नल उत्सर्जित करके इसे मुख्य विंडो के साथ सिंक्रनाइज़ रखें।
- वैश्विक चर का उपयोग करें।
सभी तीन विकल्प मेरे विशेष उपयोग मामले (हालांकि 2 थोड़ा जटिल हो जाएगा) के लिए सबसे अधिक संभावना है, लेकिन मुझे लगता है कि वहां एक बेहतर/अधिक पायथनिक/अधिक क्यूटी जैसी तरह होना चाहिए।
from PyQt4 import QtGui, QtCore
import time, sys
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.layout = QtGui.QVBoxLayout(self)
self.spinbox = QtGui.QSpinBox(self)
self.spinbox.setValue(1)
self.layout.addWidget(self.spinbox)
self.output = QtGui.QLCDNumber(self)
self.layout.addWidget(self.output)
self.worker = Worker(self)
self.connect(self.worker, QtCore.SIGNAL('beep'), self.update)
self.worker.start()
def update(self, number):
self.output.display(number)
class Worker(QtCore.QThread):
def __init__(self, host_window):
super(Worker, self).__init__()
self.host = host_window
self.running = False
def run(self):
self.running = True
i = 0
while self.running:
i += 1
self.emit(QtCore.SIGNAL('beep'), i)
sleep_time = self.host.spinbox.value()
time.sleep(sleep_time)
def stop(self):
self.running = False
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
पुनश्च::
यहाँ एक न्यूनतम काम कर उदाहरण illustrating क्या मैं इस मामले में क्या करना है, विकल्प 1 का उपयोग करना चाहते हैं जब से मैं PyQt के साथ पूरी तरह अनुभवहीन हूँ यह संभव नहीं दिखता नहीं है वहाँ के साथ अन्य समस्याओं हैं कि कोड या सवाल अस्पष्ट है। इस मामले में, कृपया प्रश्न टिप्पणी या संपादित करने के लिए स्वतंत्र महसूस करें।
मेरा उत्तर के बावजूद, अपने कोड को ठीक से काम करने लगता है का उपयोग करें, तो शायद मैं मैं गलत हूं या कुछ और मुझे नहीं मिला है। – Mel
@tmoreau। इस विशेष मामले में, कार्यकर्ता थ्रेड बस स्पिन-बॉक्स से मूल्य तक पहुंचता है। यदि उसने * मूल्य * को बदलने का प्रयास किया है, तो समस्या होने की संभावना अधिक होगी (क्योंकि इसका परिणामस्वरूप जीयूआई अपडेट हो सकता है)।हालांकि, 'मान() 'को कॉल करना अभी भी थ्रेड-सुरक्षित नहीं है, क्योंकि उपयोगकर्ता एक ही समय में स्पिन-बॉक्स मान बदल सकता है, और संभवतः ऐसे परिवर्तन * परमाणु * संचालन नहीं हैं। फिर भी, सबसे खराब हो सकता है कि कार्यकर्ता थ्रेड को स्पिन-बॉक्स से "पुराना" मान मिल सकता है। – ekhumoro