मैं बहु-थ्रेडेड ऐप प्रोग्रामिंग कर रहा हूं। मेरे पास दो धागे हैं डिवाइस से कुछ डेटा को वैश्विक डेटा बफर में स्थानांतरित करने के लिए है और दूसरा डेटा को फ़ाइल में लिखने के लिए है।धागे के भीतर डेटा के लिए प्रतीक्षा करने और फ़ाइल में लिखने के तरीके पर सबसे अच्छा अभ्यास?
डिवाइस से बफर तक डेटा अतुल्यकालिक रूप से स्थानांतरित हो रहा है। दूसरे धागे का उद्देश्य मुख्य डेटा बफर में निर्दिष्ट मात्रा में डेटा को लिखने के लिए और आखिर में फ़ाइल में लिखने के लिए प्रतीक्षा करना चाहिए।
वैसे पहला धागा डीएलएल में है और दूसरा मुख्य ऐप में है। अस्थायी रूप से मैं इसे घटनाओं के साथ हल करता हूं। पहला धागा डिवाइस से डेटा को मुख्य डेटा बफर में स्थानांतरित करता है और डेटा की गणना करता है और जब निर्दिष्ट मात्रा में डेटा स्थानांतरित किया जाता है तो यह एक ईवेंट सेट करता है। दूसरा व्यक्ति घटना के संकेत के लिए इंतजार कर रहा है और जब यह डेटा स्टोर के लिए कुछ कोड चलाता है। सरल है कि यह काम कर रहा है।
Thread1.Execute:
var DataCount, TransferedData: Integer;
DataCounter := 0;
while not Terminted do
begin
TransferData(@pData, TransferedData);
Inc(DataCounter, TransferedData)
if DataCounter >= DataCountToNotify then SetEvent(hDataCount);
end;
Thread2.Execute:
hndlArr[0] := hDataCount;
hndlArr[1] := hTerminateEvent;
while (not Terminated) do
begin
wRes := WaitForMultipleObjects(HandlesCount, Addr(hndlArr), false, 60000);
case wRes of
WAIT_OBJECT_0:
begin
Synchronize(WriteBuffer); // call it from main thread
ResetEvent(hndlArr[0]);
end;
WAIT_OBJECT_0 + 1:
begin
ResetEvent(hTerminateEvent);
break;
end;
WAIT_TIMEOUT: Break;
end;
end;
अब मैं दूसरे धागे अधिक स्वतंत्र बनाने के लिए चाहते हैं ... इसलिए मैं दूसरे धागे के कई उदाहरण बना सकते हैं और मैं पहली बार धागा के लिए प्रतीक्षा करने की जरूरत नहीं है। मैं कोड के डेटा गिनती हिस्से को पहले धागे से दूसरे में स्थानांतरित करना चाहता हूं, इसलिए मुझे पहले धागे में डेटा गिनती की आवश्यकता नहीं होगी। पहला डेटा हस्तांतरण उद्देश्य के लिए होगा।
मैं डेटा काउंटर के रूप में दूसरा डेटा उपयोग करने और डेटा स्टोर करने के लिए उपयोग करना चाहता हूं। लेकिन अब मुझे लूप करना होगा और निर्दिष्ट डेटा राशि के लिए मैन्युअल रूप से जांचना होगा। अगर मेरे पास लूप था तो मुझे कुछ नींद जोड़नी पड़ेगी, इसलिए दूसरा थ्रेड कंप्यूटर प्रदर्शन को कम नहीं करेगा, लेकिन मुझे नहीं पता कि कितनी देर तक सोना चाहिए जबकि फ़र्ट्स थ्रेड में डेटा ट्रांसफर की गति स्थिर नहीं है और इस प्रकार दूसरे थ्रेड में गिनती की गति अंतर होगा।
मेरा अनुमान है कि इस कोड नमूना अच्छा नहीं है:
Thread2.Execute:
var DataCount: Integer;
DataIdx1 := GetCurrentDataIdx;
while (not Terminated) do
begin
if (GetCurrentDataIdx - DataIdx1) >= DataCountToNotify then
begin
Synchronize(WriteBuffer);
DataIdx1 := GetCurrentIdx;
end;
sleep(???);
end;
तो मेरे सवाल का क्या डेटा गिनती के साथ कि इस मुद्दे को और दूसरा धागा भीतर भंडारण हल करने के लिए सबसे अच्छा तरीका क्या है? आपके अनुभव और सुझाव क्या हैं?
आप फाइल के लेखन को मुख्य धागे पर क्यों मजबूर करते हैं, 'सिंक्रनाइज़ (लिखेंबफर)'? मुझे समझ में नहीं आता कि आप दूसरे थ्रेड को गुणा करने के लिए कैसे प्रबंधित करेंगे और अभी भी एक फ़ाइल में लिखने के क्रम को बनाए रखें। –
थ्रेड गुणा किया जाएगा लेकिन डेटा विभिन्न फ़ाइलों में संग्रहीत किया जाएगा। मैंने कहीं भी लिखा नहीं है कि मैं इसे एक ही फाइल में लिखने जा रहा हूं। मेरा लक्ष्य एकाधिक नियंत्रण रखना है जो एक ही स्रोत से डेटा को विभिन्न फ़ाइलों में स्टोर करने में सक्षम हैं। – Nix
यह जानना अच्छा है, क्योंकि उत्तर इस जानकारी पर निर्भर करेगा। फिर भी मुझे आश्चर्य है कि फ़ाइल लेखन मुख्य धागे को क्यों लागू किया जाना चाहिए। –