স্ট্যাথ্রেড এবং মাল্টিথ্রেডিং


102

স্ট্যাথ্রেড সম্পর্কিত এমএসডিএন নিবন্ধ থেকে:

ইঙ্গিত করে যে কোনও অ্যাপ্লিকেশনের জন্য সিওএম থ্রেডিং মডেলটি একক থ্রেডযুক্ত অ্যাপার্টমেন্ট (এসটিএ)।

(রেফারেন্সের জন্য, এটি সম্পূর্ণ নিবন্ধ ।)

একক থ্রেডেড অ্যাপার্টমেন্ট ... ঠিক আছে, আমার মাথার উপর দিয়ে গেল। এছাড়াও, আমি কোথাও পড়েছি যে আপনার অ্যাপ্লিকেশনটি COM ইন্টারপ ব্যবহার না করলে এই বৈশিষ্ট্যটি আসলে কিছুই করে না। সুতরাং এটি ঠিক কী করে এবং কীভাবে এটি মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলিকে প্রভাবিত করে? মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলি (যার মধ্যে Timerএসিনক্রোনাস মেথড কলগুলির জন্য এস ব্যবহারকারী যে কোনও কিছু রয়েছে , কেবল থ্রেডপুল এবং এ জাতীয় কিছু নয়) এটি 'নিরাপদ থাকার জন্য' এমনকি এমটিএথ্রেড ব্যবহার করা উচিত? স্ট্যাথ্রেড এবং এমটিথ্রেড আসলে কী করে?

উত্তর:


60

অ্যাপার্টমেন্ট থ্রেডিং একটি সিওএম ধারণা; যদি আপনি COM ব্যবহার না করে থাকেন এবং আপনি যে APIs বলে থাকেন তার কোনওটিই "কভারের নীচে" COM ব্যবহার করেন না, তবে অ্যাপার্টমেন্ট সম্পর্কে আপনার চিন্তা করার দরকার নেই।

যদি আপনার অ্যাপার্টমেন্ট সম্পর্কে সচেতন হওয়ার প্রয়োজন হয় তবে বিশদটি কিছুটা জটিল হয়ে উঠতে পারে ; সম্ভবত একটি ওভারসিম্প্লিফাইড সংস্করণ হ'ল এসটিএ হিসাবে ট্যাগ হওয়া COM অবজেক্টগুলি অবশ্যই স্ট্যাথ্রেডে চালানো উচিত এবং এমটিএ চিহ্নিত চিহ্নিত COM অবজেক্টগুলি অবশ্যই এমটিএ থ্রেডে চালানো উচিত। এই নিয়মগুলি ব্যবহার করে, COM মার্শালিংয়ের প্রয়োজনীয়তা যেখানে এড়ানো যায় না এড়িয়ে এই বিভিন্ন বস্তুর মধ্যে কলগুলি অনুকূল করতে পারে।


7
ওভারস্প্লিপ্লাইফাইড বহুবিবাহিত বস্তুগুলি যে কোনও থ্রেডে চলতে পারে। অ্যাপার্টমেন্টের থ্রেডযুক্ত বস্তুগুলি কেবলমাত্র সেই অ্যাপার্টমেন্টে চালানো যেতে পারে যেগুলি তাদের তৈরি করা হয়েছিল
1800 তথ্য

28
কোনও এসটিএ থ্রেডের একটি এসটিএ অবজেক্ট থেকে একটি এমটিএ অবজেক্টের একটি কল এমটিএ থ্রেডকে মার্শাল করবে (যদি এমটিএ অবজেক্টটি ফ্রি-থ্রেডযুক্ত মার্শেলার প্রয়োগ না করে)। আমি যেমন বলেছি, বিশদগুলি জটিল হয়ে উঠতে পারে। (আমি সিওএম দলে বেশ কয়েক বছর ধরে হাসির জন্য কাজ করেছি )
ব্রুস

9
আপনি সরাসরি সিওএম ব্যবহার না করে থাকলেও কখনও কখনও আপনাকে এ সম্পর্কে সচেতন হতে হবে। কোনও থ্রেডকে অবশ্যই একক থ্রেডেড অ্যাপার্টমেন্ট মডেলটি ব্যবহার করা উচিত যদি এটি কোনও গ্রাফিকাল উইন্ডো প্রদর্শন করে। এই কারণেই [স্ট্যাথ্রেড] উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটিতে সর্বদা মূল পদ্ধতির শীর্ষে প্রদর্শিত হয়।
জাস্টিন ইথিয়ার

6
কোনও ফন্ট বা ফাইল ডায়ালগের মতো কিছু না জেনে আপনি কী COM ব্যবহার করতে পারেন? আমি ধরে নেব যে তারা অভ্যন্তরীণভাবে করছে, তার অর্থ কি এই নয় যে প্রায় কোনও উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটির জন্য স্ট্যাথড সেট করা দরকার হবে? আমি সত্যই COM প্রোগ্রামিং করিনি বলে আমার ন্যাভি অনুমানটি ক্ষমা করুন।
ব্রেট রায়ান

4
ঐ যে আগ্রহী জন্য একটি আরো বিস্তারিত উত্তর: stackoverflow.com/questions/4154429/apartmentstate-for-dummies
jgauffin

3

এটি কী তা এটি নিশ্চিত করে যে CoInitializeতাকে পরামিতি হিসাবে COINIT_APARTMENTTHREADED বলা হয়। আপনি যদি কোনও সিওএম উপাদান বা অ্যাকটিভএক্স নিয়ন্ত্রণ ব্যবহার না করেন তবে এটি আপনার উপর মোটেই প্রভাব ফেলবে না। আপনি যদি তা করেন তবে এটি এক ধরণের গুরুত্বপূর্ণ।

অ্যাপার্টমেন্টের থ্রেডযুক্ত কন্ট্রোলগুলি কার্যকরভাবে একক থ্রেডযুক্ত হয়, তাদের করা কলগুলি কেবলমাত্র অ্যাপার্টমেন্টে তাদের তৈরি করা প্রক্রিয়াকরণ করা যেতে পারে।

এমএসডিএন থেকে আরও কিছু বিশদ:

একক থ্রেডেড অ্যাপার্টমেন্টে (এসটিএ) তৈরি করা অবজেক্টগুলি কেবলমাত্র তাদের অ্যাপার্টমেন্টের থ্রেড থেকে মেথড কল আসে, সুতরাং কলগুলি সিরিয়ালযুক্ত হয় এবং কেবল বার্তা-সারি সীমানায় পৌঁছায় (যখন উইন 32 ফাংশন পিকম্যাসেজ বা সেন্ডম্যাসেজ বলা হয়)।

একটি মাল্টিথ্রেড অ্যাপার্টমেন্টে (এমটিএ) একটি সিওএম থ্রেডে তৈরি হওয়া অবজেক্টগুলি যে কোনও সময় অন্য থ্রেড থেকে পদ্ধতি কল পেতে সক্ষম হতে হবে। আপনি সাধারণত মাল্টিথ্রেডেড অবজেক্টের কোডে উইন 32 সিঙ্ক্রোনাইজেশন আদিম যেমন সমালোচনামূলক বিভাগ, সেমোফোরস বা মিটেক্সেস ব্যবহার করে অবজেক্টের ডেটা সুরক্ষিত করতে কিছু রূপ রূপান্তর নিয়ন্ত্রণের প্রয়োগ করতে পারেন।

নিরপেক্ষ থ্রেড অ্যাপার্টমেন্টে (এনটিএ) চালনার জন্য কনফিগার করা কোনও বস্তু যখন একটি থ্রেড দ্বারা ডাকা হয় যা এসটিএ বা এমটিএ হয়, সেই থ্রেডটি এনটিএতে স্থানান্তর করে। যদি এই থ্রেড পরবর্তীকালে CoInitializeEx কে কল করে, কল ব্যর্থ হয় এবং RPC_E_CHANGED_MODE প্রদান করে।


এমএসডিএন নিবন্ধটি একটি সিওএম দৃষ্টিকোণ থেকে সহায়ক তবে আপনি আমাকে বলতে পারবেন যখন .NET কলটি / CoInitialize()এর STAThreadগুণাবলী হিসাবে ApartmentState? দ্রষ্টব্য: এমএসডিএন সম্পর্কিত নিবন্ধটি এখানে রয়েছে: CoInitializeEx ফাংশন
jrh

না thread-> SetApartment ব্যবহার CoInitialize()অভ্যন্তরীণভাবে? আমি সেখানে সমস্তভাবে স্ট্যাথ্রিড অ্যাট্রিবিউটটি সনাক্ত করেছিলাম কিন্তু ট্রেইল শীতল হয়ে গেছে (এর উত্সটি আমি খুঁজে পাচ্ছি না Thread::SetApartment)। থ্রেড। (সিওএম থ্রেড। एच) থেকে থ্রেড ক্লাসটি কোথাও নথিভুক্ত করা হয়েছে? এটি কি এমএফসি, এটিএল, বা অন্য কিছু?

@ জেআরহ আমি দুঃখিত এর চেয়ে বেশি কোনও বিবরণ জানি না
1800 তথ্য

-15

স্ট্যাথ্রেড একটি সি # জিইউআই প্রকল্পের মূল ফাংশনের আগে লেখা হয়। এটি প্রোগ্রামকে একটি একক থ্রেড তৈরি করার অনুমতি ছাড়া কিছুই করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.