2010-08-13 21 views
5

मैंने एक समस्या में भाग लिया है जहां मैं ऐप को लटकने के बिना अपने प्रोग्राम में मैनेशिया नहीं रोक सकता।प्रोग्राम के भीतर से मिनेसिया बंद होने पर एरलांग ऐप को रोकना

मैं वर्तमान में अपने erlang ऐप के भीतर मैनेशिया के प्रोटोटाइप कर रहा हूँ।

मेरी jaus_app.erl शुरू फ़ाइल() में कॉल:

{atomic, ok} = mnesia:load_textfile("priv/mnesia_prototype.txt") 

मेरे स्टॉप() फ़ंक्शन को कॉल:

mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"), 
mnesia:stop(), 

जब मैं इन पंक्तियों के बाहर टिप्पणी और शुरू करने और से mnesia रोक erlang संकेत, मैं अपने आवेदन को साफ करने में सक्षम हूँ।

क्या मुझे इन प्रोटोटाइप कार्यों को पूरी तरह से विकसित एरलांग ऐप के भीतर उपयोग नहीं करना चाहिए?

केन।

+5

ऐसा इसलिए होता है क्योंकि आपका 'स्टॉप' फ़ंक्शन एप्लिकेशन नियंत्रक से कहा जाता है, जो 'gen_server' है, लेकिन' मैनेशिया: स्टॉप 'कॉल' एप्लिकेशन: रोकें (मैनेशिया) 'और एप्लिकेशन नियंत्रक से प्रतिक्रिया के लिए प्रतीक्षा करता है - और आपके पास डेडलॉक है। तो, सरल जवाब है "उस कॉलबैक फ़ंक्शन में 'मिनेसिया: स्टॉप' का उपयोग न करें"; मेरे पास एक बेहतर सुझाव नहीं है, हालांकि :) – legoscia

उत्तर

2

बूट फ़ाइल बनाने के लिए systools का उपयोग करके मैनेशिया को मेरे ऐप से पहले शुरू किया गया है और मेरे ऐप को बंद करने पर रोक दिया गया है। यह फांसी की समस्या को हल करता है जो उपरोक्त legoscia द्वारा संकेतित है। मेज़ेन द्वारा एरलांग परामर्श से बूट फ़ाइल विचार का सुझाव दिया गया था। उस सुझाव के लिए उनके लिए बहुत धन्यवाद।

1
erlang डॉक्स से

:

dump_to_textfile (फ़ाइल का नाम): (एक सामान्य पाठ संपादक के माध्यम से) जो तब संपादित किया जा सकता किसी टेक्स्ट फ़ाइल में एक mnesia प्रणाली के सभी स्थानीय तालिकाओं डंप और उसके बाद बाद में मैनेशिया के साथ पुनः लोड किया जाना चाहिए: load_textfile/1। केवल शैक्षिक प्रयोजनों के लिए इस फ़ंक्शन का उपयोग करें। वास्तविक बैकअप के साथ को सौदा करने के लिए अन्य कार्यों का उपयोग करें।