यह मुश्किल के लिए मुझे Sleep
का उपयोग नहीं करने के बाद से मैं अपने आप को यह सब समय का उपयोग कहने के लिए है, लेकिन Application.ProcessMessages
वास्तव में एक खतरनाक समाधान है, खासकर जब एक पाश में प्रयोग किया जाता है। मुझे यकीन नहीं है कि आप कौन सी जानकारी प्रदर्शित कर रहे हैं (क्योंकि मैं भाषा को नहीं पहचानता) लेकिन ऐसा लगता है कि आप फ़्लोट से स्ट्रिंग में कुछ रूपांतरण कर रहे हैं। यद्यपि ये रूपांतरण एक दूसरे भाग में किए जाते हैं, फिर भी उन्हें एक साथ जोड़ें और आप एक लंबे ऑपरेशन के साथ आ सकते हैं। और मान लीजिए कि आप अपडेट होने के लिए एक और मूल्य जोड़ने का निर्णय लेते हैं, जिसके लिए कुछ गणना की आवश्यकता होती है (जैसे फाइल स्थानांतरण में प्रति सेकंड बाइट्स)। यह रूपांतरण इस ऑपरेशन पर थोड़ा और समय जोड़ देगा, और इससे पहले कि आप इसे जानते हों, आप यूआई अपडेट के साथ हवादार हो सकते हैं जो आधा सेकेंड लेता है (जो लंबे समय तक नहीं लगता है, लेकिन जब प्रोसेसर उपयोग की बात आती है, तो यह काफी है एक भार)।
इसलिए, मैं इन सभी रूपांतरणों, गणनाओं आदि को करने के लिए थ्रेड का उपयोग करने का सुझाव दूंगा और जब भी वह जानकारी बदल जाती है तो ईवेंट को ट्रिगर करें। अब एक धागा निश्चित रूप से अन्य सुझाए गए समाधानों की तुलना में थोड़ा अधिक जटिल होगा, इसमें कोई संदेह नहीं है। लेकिन धागे का उपयोग करने से भी लाभ का एक बड़ा सौदा हो सकता है। आपका एप्लिकेशन भारी पृष्ठभूमि में किया जा सकता है जबकि आपका एप्लिकेशन अभी भी पूरी तरह प्रतिक्रिया दे रहा है। ध्यान रखें कि धागे का उपयोग करना बहुत मुश्किल हो सकता है, विशेष रूप से जब यह यूआई अपडेट की बात आती है।
वहाँ एक धागा बनाने के लिए कुछ तरीके है, लेकिन मैं इस सरल बनाने की कोशिश करता हूँ ...
type
TMyThread = class;
TMyThreadEvent = procedure(Sender: TObject; const Val1, Val2: String) of object;
TMyThread = class(TThread)
private
FValue1: Integer;
FValue2: Integer;
FString1: String;
FString2: String;
FOnChange: TMyThreadEvent;
procedure SYNC_OnChange;
protected
procedure Execute; override;
public
constructor Create;
property Value1: Integer read FValue1 write FValue1;
property Value2: Integer read FValue2 write FValue1;
property String1: String read FString1;
property String2: String read FString2;
property OnChange: TMyThreadEvent read FOnChange write FOnChange;
end;
...
constructor TMyThread.Create;
begin
inherited Create(False);
FValue1 := '0';
FValue2 := '0';
end;
procedure TMyThread.Execute;
var
S1, S2: String;
DoChange: Bool;
begin
DoChange:= False;
FValue2:= DoSomeBigCalculation(FValue1); //Some random big calculation
S1:= FormatFloat('#,##0.#', FValue1);
S2:= FormatFloat('#,##0.#', FValue2);
if (S1 <> FString1) then begin
FString1:= S1;
DoChange:= True;
end;
if (S2 <> FString2) then begin
FString2:= S2;
DoChange:= True;
end;
if DoChange then
Synchronize(SYNC_OnChange);
end;
procedure TMyThread.SYNC_OnChange;
begin
if assigned(FOnChange) then
FOnChange(Self, FString1, FString2);
end;
अब इस का उपयोग करने के लिए, आप Integer
गुण रूप में की जरूरत तय करेगा। सुनिश्चित करें कि आप OnChange
ईवेंट को ऊपर TMyThreadEvent
प्रकार के पैरामीटर के साथ एक प्रक्रिया में सेट करें। जब भी कोई भी मूल्य अपने मूल (या पुराने) मान से अलग होता है, तो यह इस घटना को ट्रिगर करेगा। मैं अत्यधिक अनुशंसा करता हूं कि आपके पास जो भी प्रसंस्करण कोड हो, जो इन मानों को पहले स्थान पर उत्पन्न करता है उसे थ्रेड के अंदर रखा जाना चाहिए। बहु-थ्रेडिंग की संभावनाएं विशाल हैं और उन अनुप्रयोगों में एक बड़ा फायदा साबित करती हैं जिनमें उनमें बहुत कुछ चल रहा है।
कृपया ध्यान दें कि मेरा उपरोक्त कोड सिर्फ इस वेबसाइट में सीधे नमूना टाइप किया गया है, और इसका परीक्षण नहीं किया गया है। यह आपको सिर्फ एक अद्यतन देने के लिए है कि आपके अपडेट करने के लिए थ्रेड को कैसे कार्यान्वित किया जाए।
मैं इस अधिकतम सीमा से रहता हूं: "यदि आपको नींद() का उपयोग करने की आवश्यकता महसूस होती है, तो आप इसे गलत कर रहे हैं।" –
@ निक वास्तव में। मेरा समकक्ष है "कोई समस्या नहीं है जिसके लिए नींद समाधान है।" –
@ निकहोडजेस इत्यादि। फिर, क्या आप एक विराम के लिए आवश्यकता को पूरा करते हैं जब थ्रेड स्टैक पर कई स्तर गहरे होते हैं? मुझे लगता है - 'प्रक्रियाओं को एक राज्य-मशीन के रूप में प्रक्रियात्मक रूप से लिखित स्पेक को फिर से कार्यान्वित करने में व्यतीत करें, बस नींद() कॉल के बजाए टाइमर का उपयोग किया जा सके। इसमें कोई संदेह नहीं है कि जीयूआई हैंडलर में एपी + नींद() लूप एक विशेष रूप से लंगड़ा दुरुपयोग है, लेकिन 'नींद का दुरुपयोग किया जा सकता है, इसलिए इसका उपयोग न करें' तर्क गलत है .. 'समर्थन करना मुश्किल है।' –