अगर मैं इसे निष्पादित करता हूं तो मेरा एप्लिकेशन तब तक जवाब नहीं देगा जब तक कि सभी फाइलें और उन्हें सूची बॉक्स पर नहीं मिल जाए, मेरा सवाल यह है कि मैं इस कार्य को अनपेक्षित स्थिति से बचने के लिए बहु थ्रेड कैसे कर सकता हूं! मैं अभी भी डेल्फी novoiceडेल्फी फ़ाइल खोज मल्टीथ्रेडिंग
procedure TfrMain.FileSearch(const PathName, FileName : string; txtToSearch : string; const InDir : boolean);
var Rec : TSearchRec;
Path : string;
txt : string;
fh : TextFile;
i : integer;
begin
Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
AssignFile(fh, Path + Rec.Name);
Reset(fh);
Readln(fh,txt);
if ContainsStr(txt, txtToSearch) then
ListBox1.Items.Add(Path + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
If not InDir then Exit;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
FileSearch(Path + Rec.Name, FileName, txtToSearch, True);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
+1, सरल, साफ समाधान। इतना गलत नहीं जा सकता है। –
'पोस्टमेसेज (मेनफॉर्म.हैंडल, WM_FILESEARCH_FINISHED, 0, 0) नहीं होना चाहिए; 'सिंक्रनाइज़' के साथ उपयोग किया जा सकता है? – kobik
@ कोबिक, चिंता करने की कोई आवश्यकता नहीं है, 'हैंडल' संपत्ति केवल पढ़ी जाती है और इसकी पढ़ाई परमाणु है। और इसे 0 से अलग होना चाहिए (नियंत्रण मर जाएगा और कोई संदेश नहीं मिल सका), इस प्रकार गेटटर कभी भी 'CreateHandle' नहीं करेगा जब यह हैडल 0 होता है। जोखिम ऑब्जेक्ट उदाहरण है, यदि आप 'मेनफॉर्म' को नष्ट करें और इसे एक्सेस करने का प्रयास करें, आप आम तौर पर एवी प्राप्त करेंगे। और, एम्बा ['उपयोग '] (http://edn.embarcadero.com/article/22411) यह भी :-) – TLama