1. उपयोगकर्ता क्लिक बंद होने पर थ्रेड को मुक्त और मुक्त करें जब वे प्रारंभ क्लिक करते हैं तो एक नया बनाएं।
यह निश्चित रूप से एक विकल्प है, अगर ओवरहेड न्यूनतम है।
3. एक संपत्ति है जो यह निर्धारित करने के लिए एक बूलियन है कि धागा रुक गया है या नहीं। निष्पादन में कोड केवल तभी होगा जब यह बूलियन झूठा हो।
आप ऐसा कर सकते हैं, लेकिन आपको नियमित रूप से उस बूलियन की जांच करनी होगी और यदि सेट हो तो प्रतीक्षा प्रतीक्षा लूप दर्ज करें जब तक कि इसे साफ़ नहीं किया जाता है या धागा को समाप्त करने के लिए संकेत दिया जाता है।
मुख्य रूप से टीटीएचड ऑब्जेक्ट पर बूलियन प्रॉपर्टी सेट करना थ्रेडसेफ होना चाहिए?
यह धागा सुरक्षित TThread.Terminate()
बुला, जो केवल बूलियन TThread.Terminated
संपत्ति सेट के रूप में के रूप में है।
इनमें से कौन सा विकल्प, या कोई बेहतर विकल्प, क्या मुझे जाना चाहिए?
मैं विकल्प # 4 का उपयोग करता हूं - बूलियन के बजाय संकेतित घटनाओं का उपयोग करके। उदाहरण के लिए:
type
TMyThread = class(TThread)
private
FRunEvent, FTermEvent: TEvent;
FWaitEvents: THandleObjectArray;
procedure CheckPause;
protected
procedure Execute; override;
procedure TerminatedSet; override;
public
constructor Create; reintroduce;
destructor Destroy; override;
procedure Pause;
procedure Unpause;
end;
constructor TMyThread.Create;
begin
inherited Create(False);
FRunEvent := TEvent.Create(nil, True, True, '');
FTermEvent := TEvent.Create(nil, True, False, '');
SetLength(FWaitEvents, 2);
FWaitEvents[0] := FRunEvent;
FWaitEvents[1] := FTermEvent;
end;
destructor TMyThread.Destroy;
begin
FRunEvent.Free;
FTermEvent.Free;
inherited;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// do some work...
CheckPause;
// do some more work...
CheckPause;
// do some more work...
CheckPause;
//...
end;
end;
procedure TMyThread.TerminatedSet;
begin
FTermEvent.SetEvent;
end;
procedure TMyThread.CheckPause;
var
SignaledEvent: THandleObject;
begin
while not Terminated do
begin
case TEvent.WaitForMultiple(FWaitEvents, INFINITE, False, SignaledEvent) of
wrSignaled: begin
if SignaledEvent = FRunEvent then Exit;
Break;
end;
wrIOCompletion: begin
// retry
end;
wrError: begin
RaiseLastOSError;
end;
end;
SysUtils.Abort;
end;
procedure TMyThread.Pause;
begin
FRunEvent.ResetEvent;
end;
procedure TMyThread.Unpause;
begin
FRunEvent.SetEvent;
end;
स्रोत
2016-07-22 02:18:10
डेल्फी के हाल के संस्करण थ्रेड को रोकने/फिर से शुरू करने की अनुमति नहीं देते हैं, क्योंकि संपूर्ण डिज़ाइन (और अवधारणा) त्रुटिपूर्ण था। आपको ऐसा करने का प्रयास करने से बचने चाहिए और इसके बजाय सिग्नल किए गए ईवेंट (उदा।, टीवेन्ट) का उपयोग करने के लिए स्विच करना चाहिए। SyncObjs में विभिन्न ईवेंट प्रकार देखें। –
यह भी देखें http://stackoverflow.com/questions/4401171/self-suspending-a-thread-in-delphi-when-its-not-needed-and-safely-resuming – kludg