मैं इस तरह के एक क्रिया कतार धागे पर काम कर रहा हूं और मैं एक निश्चित कार्रवाई के लिए इंतजार करना चाहता हूं। मैं मुख्य धागे में कार्रवाई करना चाहता हूं, फिर इसे कतार थ्रेड फ़ंक्शन (कतार के अंत तक) पास कर दूंगा और इस क्रिया को करने के लिए प्रतीक्षा करें। इसलिए मुझे जिस कार्रवाई को मैंने अभी पूछताछ की है, उसे अलग करने की आवश्यकता है और इसके लिए प्रतीक्षा करें।क्या यह मुख्य धागे से कार्यकर्ता धागे तक ईवेंट को पास करने और इसके लिए प्रतीक्षा करने के लिए सुरक्षित है?
मैं एक निम्न (छद्म) कोड और मैं चाहते हैं पता करने के लिए है
- इसे सुरक्षित विंडोज घटना वस्तु धागे से काम कर रहा है?
- यदि हां, तो क्या यह अवधारणा कुशल होगी?
type
TMyThread = class(TThread);
private
FEvent: THandle;
protected
procedure Execute; override;
public
procedure DoSomething(const AEvent: THandle);
end;
procedure TMyThread.Execute;
begin
// is it working with events thread safe ?
SetEvent(FEvent);
// the thread will continue, so I can't use WaitFor
// but it won't set this specific FEvent handle again
// I'm working on such kind of an action queue, so once the action with ID,
// here represented by the FEvent will be processed, it's removed from
// the action queue
end;
procedure TMyThread.DoSomething(const AEvent: THandle);
begin
FEvent := AEvent;
end;
// here's roughly what I want to do
procedure TForm1.Button1Click(Sender: TObject);
var
OnceUsedEvent: THandle;
begin
// the thread is already running and it's instantiated in MyThread
// here I'm creating the event for the single request I need to be performed
// by the worker thread
OnceUsedEvent := CreateEvent(nil, True, False, nil);
try
// here I'm passing the event handle to the worker thread (like a kind of
// a request ID)
MyThread.DoSomething(OnceUsedEvent);
// and here I want to wait for 10 seconds (and also interrupt this waiting
// when the user closes the application if possible ?) for the thread if
// performs my request
WaitForSingleObject(OnceUsedEvent, 10000);
finally
// close the event handle
CloseHandle(OnceUsedEvent);
end;
// and continue with something else
end;
धन्यवाद!
बटन ईवेंट हैंडलर में ईवेंट पर प्रतीक्षा करना मुख्य धागे को अवरुद्ध कर देगा, इसलिए यह नहीं है कि आप क्या चाहते हैं! हो सकता है कि आप इसके बजाय किसी ईवेंट का उपयोग कर सकें (जिसे थ्रेड समाप्त होने पर भी कहा जाता है) – jpfollenius
वह प्रतीक्षा जो आप चाहते हैं वह करने के लिए नहीं है। इसे बाधित नहीं किया जा सकता है। और आप 10 के लिए क्यों ब्लॉक करना चाहते हैं? यह सिर्फ अजीब है। –
आदर्श रूप से INFINITE; और यह कार्रवाई का नाम बदलने के लिए है। मुझे वर्चुअल ट्री व्यू नोड के संपादन मोड में प्रवेश करने की आवश्यकता है और जब तक मुझे थ्रेड से नामांकन कार्रवाई का नतीजा न हो जाए तब तक संपादक को जीवित रखें (मेरे पास एक अतिरिक्त ईवेंट हैंडलर है जहां मुझे परिणाम पारित करने की आवश्यकता है और जब मैं बाहर निकलता हूं इस घटना हैंडलर संपादक छुपा है)। –