MFC (Microsoft Foundation Classes) অ্যাপ্লিকেশনগুলিতে Multithreading ব্যবহার করা একটি গুরুত্বপূর্ণ বিষয়, বিশেষত যখন আপনি অ্যাপ্লিকেশনটি দীর্ঘ সময় ধরে চলতে থাকা কাজ সম্পাদন করতে চান। CWinThread ক্লাস MFC তে থ্রেড তৈরি এবং পরিচালনা করার জন্য ব্যবহৃত হয়। এটি একটি সহজ উপায় দেয় অ্যাপ্লিকেশনের মধ্যে থ্রেডিং কার্যক্রম পরিচালনা করতে, যেমন ব্যাকগ্রাউন্ডে কাজ চালিয়ে যাওয়ার সময় UI অ্যাপ্লিকেশনটি রেসপন্সিভ রাখা।
এখানে CWinThread ব্যবহার করে থ্রেড তৈরি এবং পরিচালনা করার প্রক্রিয়া আলোচনা করা হবে।
CWinThread ক্লাস
CWinThread হল MFC এর একটি ক্লাস যা একটি থ্রেড তৈরি ও পরিচালনা করতে ব্যবহৃত হয়। CWinThread এর মাধ্যমে আপনি একটি নতুন থ্রেড তৈরি করতে পারেন, যা মূল থ্রেড থেকে আলাদা হয়ে কাজ করবে।
CWinThread ব্যবহার করার জন্য সাধারণ ধাপ:
- CWinThread এর একটি সিবস্ট্যান্স তৈরি করুন।
- Thread function (যা থ্রেডটি সম্পাদন করবে) তৈরি করুন।
- AfxBeginThread ফাংশন ব্যবহার করে থ্রেডটি চালু করুন।
- Thread function থেকে কাজ সম্পাদন করা।
CWinThread ব্যবহার করে Thread তৈরি
1. CWinThread সাবক্লাস তৈরি
MFC তে একটি থ্রেড তৈরি করার জন্য প্রথমে আপনাকে CWinThread ক্লাসের একটি সাবক্লাস তৈরি করতে হবে। থ্রেডটি যে ফাংশনটি চালাবে তা এই সাবক্লাসে লিখতে হবে।
Code Example:
class CMyThread : public CWinThread
{
DECLARE_DYNCREATE(CMyThread)
public:
CMyThread() {}
virtual ~CMyThread() {}
// Override the InitInstance and Run functions
virtual BOOL InitInstance() override;
virtual int Run() override;
};
এখানে, InitInstance() এবং Run() ফাংশন দুটি গুরুত্বপূর্ণ। InitInstance() থ্রেডটি শুরু করার আগে একবার কল হয় এবং Run() ফাংশনটি থ্রেডের কাজ শুরু করার জন্য ব্যবহৃত হয়।
2. Thread Function তৈরি করা
আপনার থ্রেডটি একটি নির্দিষ্ট কাজ করবে, যেমন একটি লম্বা প্রসেস চালানো, ডেটা প্রসেসিং, বা ইউজারের ইনপুট প্রক্রিয়া করা। এই কাজটি Run() ফাংশনে লিখতে হবে।
Code Example (Thread Function):
int CMyThread::Run()
{
// থ্রেডের কাজ এখানে লিখুন
for (int i = 0; i < 10; i++)
{
AfxMessageBox(_T("Thread is Running"));
Sleep(1000); // এক সেকেন্ডের জন্য থ্রেডটিকে বিরতি দিন
}
return 0;
}
এখানে, Run() ফাংশনটি ১০ বার একটি বার্তা বক্স দেখাবে এবং প্রতি বার এক সেকেন্ড বিরতি নেবে। এই ফাংশনটি থ্রেডের কার্যক্রমের মূল অংশ।
3. AfxBeginThread ব্যবহার করে থ্রেড শুরু করা
এখন, AfxBeginThread ফাংশনটি ব্যবহার করে থ্রেড শুরু করা হবে। এটি CWinThread এর একটি সিবস্ট্যান্স তৈরি করবে এবং থ্রেড শুরু করবে।
Code Example (Starting the Thread):
void CMyApp::OnStartThread()
{
// থ্রেড তৈরি এবং শুরু
CMyThread* pThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
}
এখানে AfxBeginThread ফাংশনটি CMyThread ক্লাসের একটি ইনস্ট্যান্স তৈরি করবে এবং থ্রেডটি চালু করবে। RUNTIME_CLASS(CMyThread) ম্যাক্রোটি থ্রেড ক্লাসের টাইপ নির্দিষ্ট করে।
CWinThread এর Life Cycle
- Thread Creation:
AfxBeginThreadফাংশন থ্রেড তৈরি করে এবং তার InitInstance ফাংশন কল করে। - Run Method: থ্রেডের কাজ Run() মেথডের মধ্যে সম্পাদিত হয়। এটি থ্রেডের কাজ বা কার্যক্রম নির্দেশ করে।
- Thread Termination: যখন থ্রেডের কাজ শেষ হয়ে যায়, তখন এটি নিজেই শেষ হয়ে যায় বা
ExitInstance()ফাংশন কল করে থ্রেডটি বন্ধ হয়।
CWinThread এর পরামর্শিত ব্যবহার
- UI Thread থেকে আলাদা থ্রেড ব্যবহার: যদি আপনার অ্যাপ্লিকেশনে দীর্ঘ সময় নেয়ার কাজ থাকে (যেমন ডেটাবেসের সাথে যোগাযোগ, ইন্টারনেট থেকে ডাটা নেওয়া), তাহলে তা UI থ্রেড থেকে আলাদা থ্রেডে করা উচিত। এর ফলে অ্যাপ্লিকেশনটি হ্যাঙ্গ হয়ে যাবে না এবং ব্যবহারকারীর জন্য সাড়া দেওয়া যাবে।
- Thread Synchronization: যদি একাধিক থ্রেড একে অপরের ডেটার উপর কাজ করে, তবে ডেটার নিরাপত্তা নিশ্চিত করতে Mutex বা Critical Section ব্যবহার করা উচিত।
থ্রেডের মধ্যে UI আপডেট করা
MFC তে, UI থ্রেডের বাইরে থ্রেড তৈরি করার পর, আপনি সরাসরি UI (যেমন, উইন্ডো বা ডায়ালগ) আপডেট করতে পারবেন না। তবে, আপনি PostMessage বা SendMessage ফাংশন ব্যবহার করে UI থ্রেডে কমান্ড পাঠাতে পারেন।
Code Example (UI Thread Update Using PostMessage):
void CMyThread::Run()
{
for (int i = 0; i < 10; i++)
{
// এখানে UI থ্রেডকে আপডেট করতে PostMessage ব্যবহার করতে পারেন
AfxGetMainWnd()->PostMessage(WM_USER, 0, 0);
Sleep(1000);
}
}
এখানে PostMessage ফাংশনটি UI থ্রেডকে সিগন্যাল পাঠাবে এবং UI থ্রেডের জন্য একটি ইভেন্ট বা কাজ সম্পাদন করতে সক্ষম হবে।
সারাংশ
CWinThread ক্লাস ব্যবহার করে MFC অ্যাপ্লিকেশনে থ্রেড তৈরি করা সহজ এবং কার্যকরী। আপনি AfxBeginThread ফাংশন ব্যবহার করে থ্রেড শুরু করতে পারেন এবং থ্রেডের কাজ Run() ফাংশনে লিখতে পারেন। এছাড়া, Thread Synchronization এর জন্য Mutex বা Critical Section ব্যবহার করা উচিত। থ্রেড UI থ্রেডের সাথে ইন্টারঅ্যাক্ট করতে চাইলে PostMessage বা SendMessage ব্যবহার করা যেতে পারে। MFC তে থ্রেডিং অ্যাপ্লিকেশনটির পারফরম্যান্স এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়তা করে।
Read more