अजीब समस्या। शायद कोई कुछ अंतर्दृष्टि दे सकता है।किसी भी तरह से दूषित जारी हैंडल?
परिदृश्य 1। मेरे पास स्मृति में एक TBitmap है जो जटिल पिक्सेल के रंग की गणना करने के लिए जटिल गणना के दौरान लिखा जाता है। प्रत्येक बार (आमतौर पर बिटमैप भरने वाली प्रत्येक क्षैतिज रेखा के बाद) TBitmap को एक रूप में एक छवि पर खींचा जाता है (image1.Canvas.Draw (0, 0, TBitmap)। अधिकांश समय यह ठीक काम करता है, लेकिन मैंने देखा कि यदि प्रत्येक बिटमैप लाइन के लिए कई धीमी जटिल कैल्क्स हैं (30 सेकंड से अधिक या गणना करने के लिए एक मिनट लेते हैं) तो मुख्य रूप में एक क्षणिक "झिलमिलाहट" होता है जो किसी भी तरह बिटमैप को मिटा देता है, इसलिए image.draw कॉल केवल ड्रॉ करता है नवीनतम गणना की लाइन और पहली y लाइनों बिटमैप में बाहर blanked कर रहे हैं। मैं गणना करने से पहले बिटमैप लॉक करके इस के आसपास मिला है।
परिदृश्य 2. यह मुख्य परेशानी। मैं एक TMemoryStream लिए लिख रहा हूँ है बिटमैप के बजाए। वही सौदा। गणना प्रत्येक पिक्सेल मान की गणना करने के लिए होती है और फिर प्रत्येक पिक्सेल मान TMemoryStream को लिखा जाता है प्रक्रिया के दौरान memstream.Write (बाइटवेल्यू, 1) के साथ। सभी गणनाओं के अंत में मैं स्ट्रीम को memstream के साथ बिटमैप में सहेजता हूं। सेवटोफाइल ('जो भी। बीएमपी') और फिर स्ट्रीम को memstream के साथ मुक्त करें। फ्री। यदि गणना त्वरित है तो धारा कोई फर्क नहीं पड़ता कि आकार क्या है (मैं 10000x10000 आयामों के साथ परीक्षण कर रहा हूं)।
मैं भी बता के रूप में मुख्य आवेदन खिड़की/रूप की तरह यह रंगा जा रहा है एक मामूली झिलमिलाहट है परिणामी फ़ाइल भ्रष्ट हो जाएगा कर सकते हैं। जब ऐसा होता है तो ऐसा लगता है जैसे बिटमैप्स और टीएममोरीस्ट्रीम के लिए हर हैंडल को मार दिया/ताज़ा किया जाता है ताकि मौजूदा डेटा दूषित हो।
कोई विचार? यह वास्तव में बेकार है। विशेष रूप से जब प्रत्येक एकल छवि को केवल यह देखने के लिए एक घंटा लग सकता है कि पृष्ठभूमि में कुछ खत्म होने पर और बिटमैप या टीएममोरीस्ट्रीम को दूषित कर दिया जाए।
क्या कोई तरीका है कि मैं एक TMmoryStream हैंडल को लॉक कर सकता हूं जैसे कि मैं बिटमैप के साथ कर सकता हूं? इससे मदद मिल सकती है। या डेल्फी को बताने के लिए कुछ घोषणा "मेरे ऑब्जेक्ट्स के साथ गड़बड़ न करें, भले ही ऐसा लगता है कि ऐप बहुत लंबा समय ले रहा है"
या क्या किसी को डेल्फी के पीछे के पीछे के कारण को पता है जो ऐसा होने का कारण बनता है।
टीएममोरीस्ट्रीम प्रक्रिया के अंदर बनाया गया है जो सभी गणनाओं को स्थानीय वस्तु है। बिटमैप मुद्दे के साथ बिटमैप प्रक्रिया के बाहर एक वैश्विक चर था और ऐसा हुआ, इसलिए मुझे नहीं लगता कि यह कारण है।
यह विंडोज 7 के तहत भी है, लेकिन मैंने Vista के तहत मूल बिटमैप समस्या देखी है।
अद्यतन 1:
क्षमा करें टिप्पणियों का उपयोग नहीं है, लेकिन वहाँ पाठ का आकार पर restirction ...
रेमी (और किसी और यह पढ़) कोजवाब में ...
है के लिएसिंगल थ्रेडेड। गणना के त्वरित होने पर मेमोरीस्ट्रीम के लिए यह 5000x5000 रिज़ॉल्यूशन के लिए ठीक काम करता है, लेकिन यदि विफल हो तो विफल हो जाता है।
एक बुनियादी ढांचे के रूप में कोड DoCalcs अपेक्षाकृत तेजी से तो सब कुछ योजना के लिए चला जाता है, तो
SetupMemorystream;
for y:=0 to height do
for x:=0 to width do
DoCalcs;
SetByteValue;
end;
end;
SaveStream;
की तर्ज पर है। यदि यह धीमा है तो मुझे TMemoryStream भ्रष्टाचार मिलता है और परिणामस्वरूप बिटमैप स्ट्रीम को भ्रष्ट कर दिया जाता है।
यह स्मृति में टीबीआईटीएमएपी का उपयोग करने के समान था जब तक कि मुझे पता चला कि मैं बिटमैप को लॉक कर सकता हूं जो डेल्फी और/या विंडोज को "जब चाहें" को एक नए हैंडल को फिर से चालू करता है जो बिटमैप के अंदर डेटा दूषित करता है।
यह एक संयोग नहीं लगता ऐसी ही समस्या का TMemoryStream और उसके हैंडल के साथ नहीं हो रहा है की बहुत अधिक है।
अद्यतन 2:
एक और जानकारी की शायद उपयोगी बिट।
जब TMemoryStream ठीक बचाता परिणामी फ़ाइल (एक 5000x5000 बिटमैप के लिए) आकार में 75,000,054 बाइट है।
जब बचाया धारा भ्रष्ट है यह (जब संभाल दूषित है जब तक धारा सहेजा जाता है से आकार के) एक यादृच्छिक मूल्य हो रहा है। उदाहरण आकार 22 एमबी और 9 एमबी रहे हैं।
जब मैं जिसके परिणामस्वरूप फ़ाइलों को देखने के लिए एक हेक्स संपादक यह पता चलता है कि फ़ाइलों की शुरुआत हैडर मात्रा के साथ सही हैं है, लेकिन किसी भी तरह पूंछ काट समाप्त होता है।
यह बहुत विचित्र है। वैसे भी मैं निश्चित रूप से एक SaveemoFile कॉल के बाद और इसे मुक्त करने से पहले एक TMemoryStream फ्लश कर सकते हैं?
क्या आपका कोड बहु-थ्रेडेड है? यदि नहीं, तो गणना की गति कोई कारण नहीं है जिन समस्याओं का आपने वर्णन किया है। आपके पास बस बग्गी कोड है जो बिटमैप/स्ट्रीम में दूषित डेटा लिख रहा है। –
आप हमेशा अपने प्रश्नों और उत्तरों, और आपके द्वारा पूछे गए प्रश्नों के किसी भी उत्तर पर 1 प्रतिनिधि के साथ टिप्पणी कर सकते हैं। आपको अपने प्रश्न को संपादित करने में भी सक्षम होना चाहिए। –
मेमोरी स्ट्रीम केवल कक्षा में लिपटे मेमोरी का एक हिस्सा है। वीसीएल और आरटीएल किसी भी तरह से इसके साथ गड़बड़ नहीं करेंगे। तो आपकी समस्या कोड में कहीं भी होनी चाहिए। – Runner