मैं एक प्रोग्राम है जो निम्नलिखित करता लिखा है ...क्या मेरे डेल्फी प्रोग्राम को बड़ी संख्या में फाइलों की प्रतिलिपि बनाने की प्रतीक्षा करने का कोई तरीका है?
- मॉनिटर एक विशिष्ट फ़ाइल नाम है कि अंततः एक उप फ़ोल्डर में बनाया जाएगा साथ एक नई फ़ाइल के निर्माण के लिए एक फ़ोल्डर।
- फ़ाइल के निर्माण पर, उप फ़ोल्डर्स पथ को टीएलआईस्ट के रूप में एक कतार में जोड़ा जाता है।
- फ़ाइलों को निर्माण आदेश में संसाधित किया जाना चाहिए।
- सबफ़ोल्डर में सभी फ़ाइलों (इस मामले में छवियों) को संसाधित करने के लिए एक प्रक्रिया को बुलाया जाता है जिसमें फ़ाइलों को किसी नेटवर्क स्थान पर ले जाना शामिल होता है।
- उपफोल्डर पथ कतार (टीएलआईस्ट) से हटा दिया गया है।
- यदि कतार में कोई और पथ मौजूद है, तो अगला पथ प्रसंस्करण प्रक्रिया में पारित किया जाता है।
उस समय नंबर और इतने छवियों का आकार पर निर्भर करता है किसी नेटवर्क स्थान पर फ़ाइलों की प्रतिलिपि करने के लिए ...
वहाँ एक रास्ता डेल्फी प्रतीक्षा करने के लिए प्राप्त करने के लिए है है खत्म करने के लिए फ़ाइल ऑपरेशन की प्रक्रिया के लिए?
मैंने थोड़ी देर की कोशिश की जो एक बुलियन मूल्य बदलने के लिए इंतजार कर रहा था (जब फ़ाइल पर प्रतिलिपि बनाई गई अंतिम फाइल को बदल दिया गया था) लेकिन उस एप्लिकेशन को लटका दिया गया था (यहां तक कि application.processMessage के साथ) और dirMonitor घटक विफल अगले उप फ़ोल्डर को TList में जोड़ें।
किसी भी सुझाव की सराहना की जाएगी।
अग्रिम धन्यवाद।
replys के लिए धन्यवाद ...
मैं जो आदर्श लग रहा है ... हालांकि मैं केवल डेल्फी 7 इसलिए इसकी एक नहीं जाने के लिए उपयोग किया OmniThread पर एक नज़र था।
समस्या इम होने कि फ़ोल्डरों भिन्न आकार और नेटवर्क यातायात आदि की वजह से समय की मात्रा बदलती ले हस्तांतरण करने के लिए ... छवियों का एक बहुत कुछ के साथ एक फ़ोल्डर केवल कुछ छवियों के साथ एक फ़ोल्डर द्वारा पीछा किया जाता है है, दोनों में से छोटे नेटवर्क गंतव्य तक पहुंच रहा है। नेटवर्क विलुप्त होने वाला तीसरा पक्ष प्रिंट स्पूलर है, इसलिए प्रिंट गलत क्रम में आते हैं।
सरलीकृत कोड:
procedure TForm1.programTimerTimer(Sender: TObject);
begin
if (fileOperationInProgress = false) AND (programPaused = false) then
begin
processOrderQueue;
end;
end;
procedure TForm1.processOrderQueue;
begin
// gets folder paths from queue
// processes images
// copy to print spooler (network location)
copyFolder(fromPath, toPath);
// remove temp files
end;
procedure TForm1.copyFolder(copyFrom : String; copyTo : String);
var
fos : TSHFileOpStruct;
begin
fileOperationInProgress := True;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY or FOF_SILENT;
pFrom := PChar(copyFrom);
pTo := PChar(copyTo)
end;
ShFileOperation(fos);
fileOperationInProgress := False;
end;
सोचो मैं जवाब के साथ आए हैं ... मैं एकल थ्रेड में सभी फाइल operationions करते हैं और एक वैश्विक 'व्यस्त' स्थापित करने के लिए जा रहा हूँ बुलियन जब यह शुरू होता है और इसे पूरा होने पर फिर से बदल देता है। इस तरह से जब कोई फ़ाइल ऑपरेशन प्रगति पर है तो शेल मॉनीटर संदेशों को याद नहीं करेगा।
फाइलों की प्रतिलिपि बनाने के लिए आप किस फ़ंक्शन का उपयोग कर रहे हैं? [SHFileOperation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx)? – RRUZ
आप फ़ाइलों की प्रतिलिपि कैसे बना रहे हैं? कृपया कोड दिखाएं। –
आप [कॉपी-फाइल-इन-ए-थ्रेड] (http://stackoverflow.com/questions/1766626/copy-file-in-a-thread) में गैबर के उदाहरण का पालन करने का प्रयास कर सकते हैं। जब कॉपी समाप्त हो जाती है तो मुख्य धागा अधिसूचित किया जाता है। –