हाँ, आप एक नए प्रकार जो TThread से विरासत घोषित
TMyWorkerThread = class(TThread)
public
procedure Execute; override;
end;
यही प्रक्रिया कॉल किया जाएगा प्रारंभ करने पर अपना धागा। इसे आपके मुख्य कार्यक्रम के साथ समानांतर में निष्पादित किया जाएगा। चलो इसे लिखो।
procedure TMyWorkerThread.Execute;
begin
//Here we do work
DoSomeWork();
DoMoreWork();
//When we exit the procedure, the thread ends.
//So we don't exit until we're done.
end;
इसका उपयोग कैसे करें? आइए मान लें कि जब आप बटन क्लिक करते हैं तो आप काम करना शुरू करना चाहते हैं। आप ऑनक्लिक हैंडलर लिखते हैं:
procedure TMainForm.Button1Click(Sender: TObject);
begin
TMyWorkerThread.Create(false);
end;
यही है। उपयोगकर्ता क्लिक बटन के बाद, आपका थ्रेड शुरू होता है और जो कुछ भी आपने किया है, उसे निष्पादित करने के साथ प्राप्त होता है। यदि उपयोगकर्ता दोबारा बटन क्लिक करता है, तो दूसरा धागा शुरू होगा, और फिर दूसरा - प्रत्येक क्लिक पर। वे सभी समानांतर में भाग लेंगे, प्रत्येक निष्पादन() में और जो समाप्त होता है, सब कुछ कर रहा है।
मान लें कि आप यह जांचना चाहते हैं कि काम खत्म हो गया है या नहीं। के लिए, आप कहीं अपने धागा के संदर्भ में स्टोर करने के लिए होगा:
TMainForm = class(TForm)
{...skipped...}
public
MyWorkerThread: TThread;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
//This time we make sure only one thread can be started.
//If one thread have been started already, we don't start another.
if MyWorkerThread<>nil then
raise Exception.Create('One thread have already been started!');
MyWorkerThread := TMyWorkerThread.Create(false);
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
//If the work is not over yet, we display message informing the user we're still working
if (MyWorkerThread<>nil) and (WaitForSingleObject(MyWorkerThread.Handle, 0)<>WAIT_OBJECT_0) then
MessageBox(Self.Handle, pchar("The work is not yet done!"), pchar("Still running"), MB_OK);
end;
जैसा कि आप देख, हम जाँच कर रहे हैं अगर एक धागा अभी भी एक Windows समारोह WaitForSingleObject बुलाया फोन करके चल रहा है। यह फ़ंक्शन तब तक प्रतीक्षा करता है जब तक थ्रेड काम नहीं कर लेता है, या टाइमआउट समाप्त हो जाता है, और जैसा कि हम 0 का टाइमआउट निर्दिष्ट करते हैं, तो थ्रेड अभी खत्म नहीं होने पर यह तुरंत मौजूद है।
आपने कई नमूने की कोशिश की और आप असफल रहे। तो आपको एक और उदाहरण क्या देगा? आपको अधिक विस्तृत प्रश्न पूछना चाहिए। आपको किस समस्या का सामना करना पड़ रहा है? बीटीडब्लू, यह ट्यूटोरियल अच्छा दिखता है: http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial – adf88
और एक और, कभी-कभी यह बेहतर समाधान होता है (क्योंकि यह आसान है) एप्लिकेशन को कॉल करने के लिए। प्रोसेस मैसेज समय-समय पर आपके समय लेने वाली प्रक्रिया के अंदर (उदाहरण के लिए बस कुछ प्रगति पट्टी को अपडेट करने या कुछ अन्य एनीमेशन खेलने के लिए जो उपयोगकर्ता को दिखा रहा है कि एप्लिकेशन व्यस्त है)। – adf88
HI, adf88, मैं पूरी तरह से आपसे सहमत हूं। लेकिन नमूने के साथ समस्या यह है कि मैं वास्तव में थ्रेड के बारे में पूरी बात नहीं करता हूं, इसलिए मैंने सोचा कि एक साधारण नमूना मेरे लिए चीजों को और स्पष्ट कर सकता है। किसी भी तरह से, मैंने एप्लिकेशन के साथ समस्या हल की। प्रोसेसमेसेस, धन्यवाद –