मैं स्कैला में एक छोटा सा एप्लीकेशन लिख रहा हूं। एप्लिकेशन सरल लॉग फ़ाइलों को संसाधित करता है। क्योंकि प्रसंस्करण में कुछ समय लगता है, मैंने अपने आवेदन कोर को अभिनेता का विस्तार करने का फैसला किया है।स्कैला स्विंग अनुप्रयोगों में अभिनेताओं के साथ बातचीत
class Application extends Actor {
def react() {
loop {
react {
case Process(file) => // do something interesting with file...
}
}
}
}
एक लॉग फ़ाइल के प्रसंस्करण जीयूआई में एक बटन क्लिक करके शुरू हो रहा है। गुई स्कैला स्विंग का उपयोग करता है।
object Gui extends SimpleSwingApplication {
val application = new Application().start()
def top = new MainFrame {
val startButton = new Button
reactions += {
case ButtonClicked(`startButton`) => application ! Process(file)
}
}
}
अब, आवेदन कोर को वर्तमान प्रगति के बारे में गुई को सूचित करने की आवश्यकता है।
sender ! Progress(value) // whenever progress is made
मैंने इसे गुई के अंदर एक अलग अभिनेता बनाकर हल किया है। अभिनेता को एड थ्रेड के अंदर निष्पादित किया गया है। यह एप्लिकेशन कोर से संदेशों को सुनता है और गुई को अपडेट करता है।
object Gui extends SimpleSwingApplication {
val actor = new Actor {
override val scheduler = new SchedulerAdapter {
def execute(fun: => Unit) { Swing.onEDT(fun) }
}
start()
def act() {
loop {
react {
case ForwardToApplication(message) => application ! message
case Progress(value) => progressBar.value = value
}
}
}
}
}
के बाद से आवेदन कोर संदेश के प्रेषक के बारे में पता करने की जरूरत है, तो मैं आपको एप्लिकेशन कोर करने के लिए जीयूआई से संदेशों को अग्रेषित करने के लिए इस अभिनेता का उपयोग, मेरे अभिनेता नया इस बना रही है।
reactions += {
case ButtonClicked(`startButton`) => actor ! ForwardToApplication(Process(file))
}
यह कोड ठीक काम करता है। मेरा सवाल: क्या ऐसा करने का कोई आसान तरीका है? यह मेरे आवेदन संदेशों के लिए प्रतिक्रिया तंत्र का सरल उपयोग करने के लिए अच्छा होगा:
reactions += {
case Progress(value) => progressBar.value = value
}
कोई विचार यह कैसे प्राप्त करें?
मुझे लगता है कि यह एक अच्छा समाधान है। हो सकता है कि मैं बदले में एक उत्थान के लायक हूं;) – gerferra
मुझे लगता है कि आप 'इंटरमीडिएटर' गायब हैं, 'बटन पर क्लिक किया गया' – gerferra
@geferra 'मध्यस्थ!' कॉल 'केस क्लास भेजें' के निर्माता के अंदर है। 'मध्यस्थ' को एक अंतर्निहित पैरामीटर के माध्यम से पारित किया जाता है। मैं आपके उत्तर को उखाड़ फेंक रहा हूं क्योंकि यह मेरे अपने समाधान के लिए प्रेरणा प्रदान करता है। –