উত্তর:
সিওএম থ্রেডিং মডেলটিকে "অ্যাপার্টমেন্ট" মডেল বলা হয়, যেখানে প্রাথমিক সিওএম অবজেক্টগুলির সম্পাদনের প্রসঙ্গটি একটি একক থ্রেড (একক থ্রেড অ্যাপার্টমেন্ট) বা অনেকগুলি থ্রেড (মাল্টি থ্রেড অ্যাপার্টমেন্ট) এর সাথে জড়িত। এই মডেলটিতে কোনও সিওএম অবজেক্ট, একবার অ্যাপার্টমেন্টে শুরু করা, রানটাইমের সময়কালের জন্য সেই অ্যাপার্টমেন্টের অংশ।
এসটিএ মডেলটি COM অবজেক্টগুলির জন্য ব্যবহৃত হয় যা থ্রেড নিরাপদ নয়। তার মানে তারা নিজের সিঙ্ক্রোনাইজেশন পরিচালনা করে না। এর সাধারণ ব্যবহার হ'ল একটি ইউআই উপাদান। সুতরাং যদি অন্য কোনও থ্রেডের সাথে অবজেক্টের সাথে যোগাযোগ করা প্রয়োজন (যেমন কোনও ফর্মের বোতামটি চাপানো) তবে বার্তাটি STA থ্রেডে মার্শাল করা হবে। উইন্ডোজ ফর্ম বার্তা পাম্পিং সিস্টেম এর একটি উদাহরণ।
যদি COM অবজেক্টটি তার নিজস্ব সিঙ্ক্রোনাইজেশন পরিচালনা করতে পারে তবে এমটিএ মডেলটি ব্যবহার করা যেতে পারে যেখানে মার্শাল কল ছাড়াই মাল্টিপল থ্রেডগুলিকে বস্তুর সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেওয়া হয়।
কীভাবে অবজেক্টগুলিতে কল পরিচালিত হয় এবং তাদের কতটুকু সুরক্ষা দরকার তা এগুলি সবই নীচে। COM অবজেক্টগুলি রানটাইমকে একই সময়ে একাধিক থ্রেড দ্বারা ডাকা থেকে রক্ষা করতে জিজ্ঞাসা করতে পারে; যেগুলি সম্ভাব্যভাবে বিভিন্ন থ্রেড থেকে একযোগে কল করা যায় না, তাই তাদের নিজস্ব ডেটা রক্ষা করতে হবে।
তদ্ব্যতীত, রানটাইমটির জন্যও কোনও সিওএম অবজেক্ট কলটি ইউজার ইন্টারফেসকে ব্লক করা থেকে বিরত রাখা প্রয়োজন, যদি কোনও কলটি যদি কোনও ইউজার ইন্টারফেস থ্রেড থেকে আসে।
একটি এপার্টমেন্ট লাইভ অবজেক্টের জন্য একটি জায়গা, এবং তারা এক বা একাধিক থ্রেড ধারণ করে। কল করার পরে অ্যাপার্টমেন্টটি কী হবে তা সংজ্ঞায়িত করে। কোনও অ্যাপার্টমেন্টে অবজেক্টগুলিতে কলগুলি পাওয়া যাবে এবং সেই অ্যাপার্টমেন্টের যে কোনও থ্রেডে প্রক্রিয়াজাত করা হবে, ব্যতিক্রম ব্যতীত ডান অ্যাপার্টমেন্টে থ্রেডের মাধ্যমে কলটি নিজেই প্রক্রিয়াভুক্ত হয় (অর্থাত্ বস্তুর প্রত্যক্ষ কল)।
থ্রেডগুলি একক থ্রেডেড অ্যাপার্টমেন্টে (কোনও ক্ষেত্রে তারা সেই অ্যাপার্টমেন্টের একমাত্র থ্রেড) বা বহু-থ্রেডেড অ্যাপার্টমেন্টে থাকতে পারে। তারা নির্দিষ্ট করে যখন থ্রেডটি এই থ্রেডের জন্য COM শুরু করে।
এসটিএ মূলত ইউজার ইন্টারফেসের সাথে সামঞ্জস্যের জন্য যা নির্দিষ্ট থ্রেডের সাথে আবদ্ধ। কোনও এসটিএ একটি লুকানো উইন্ডোতে উইন্ডো বার্তা গ্রহণের মাধ্যমে প্রক্রিয়াজাত কলগুলির বিজ্ঞপ্তিগুলি গ্রহণ করে; যখন এটি আউটবাউন্ড কল করে, অন্যান্য উইন্ডো বার্তাগুলি প্রক্রিয়াজাতকরণ রোধ করতে এটি একটি মডেল বার্তা লুপ শুরু করে। কল করার জন্য আপনি একটি বার্তা ফিল্টার নির্দিষ্ট করতে পারেন, যাতে আপনার অ্যাপ্লিকেশনটি অন্য বার্তাগুলির প্রতিক্রিয়া জানাতে পারে।
বিপরীতে সমস্ত এমটিএ থ্রেডগুলি প্রক্রিয়াটির জন্য একটি একক এমটিএ ভাগ করে। পুল সীমা অবধি কোনও থ্রেড উপলব্ধ না থাকলে আগত কলটি পরিচালনা করতে সিওএম একটি নতুন কর্মী থ্রেড শুরু করতে পারে। আউটবাউন্ড কল করার থ্রেডগুলি কেবল ব্লক করে।
সরলতার জন্য আমরা কেবলমাত্র ডিএলএলগুলিতে প্রয়োগ করা অবজেক্টগুলি বিবেচনা করব, যা ThreadingModel
তাদের শ্রেণীর কীটির মান নির্ধারণ করে রেজিস্ট্রিতে তারা কী সমর্থন করে তা বিজ্ঞাপন দেয় । চারটি বিকল্প রয়েছে:
ThreadingModel
মান উপস্থিত নেই) হোস্টের মূল ইউআই থ্রেডে অবজেক্টটি তৈরি করা হয়েছে এবং সমস্ত কলগুলি সেই থ্রেডে মার্শাল করা হয়েছে। ক্লাস কারখানাটি কেবল সেই থ্রেডে ডাকা হবে।Apartment
। এটি নির্দেশ করে যে ক্লাসটি যে কোনও একক থ্রেডড-মোড থ্রেডে চলতে পারে। থ্রেড যা এটি তৈরি করে এটি যদি একটি এসটিএ থ্রেড হয় তবে অবজেক্টটি সেই থ্রেডটিতে চলবে, অন্যথায় এটি মূল এসটিএতে তৈরি হবে - যদি কোনও প্রধান এসটিএ উপস্থিত না থাকে তবে এটির জন্য একটি এসটিএ থ্রেড তৈরি করা হবে। (এর অর্থ এমটিএ থ্রেড যা অ্যাপার্টমেন্টের অবজেক্ট তৈরি করে তা সমস্ত কলকে আলাদা থ্রেডে মার্শাল করে দেবে)) ক্লাস ফ্যাক্টরিটি একাধিক এসটিএ থ্রেড সহ একই সাথে বলা যেতে পারে তাই এটির অবশ্যই এর অভ্যন্তরীণ ডেটা এর বিরুদ্ধে রক্ষা করতে হবে।Free
। এটি এমটিএতে চালনার জন্য ডিজাইন করা একটি শ্রেণি নির্দেশ করে। এটি সর্বদা এমটিএতে লোড হবে, এমনকি কোনও এসটিএ থ্রেড দ্বারা নির্মিত হলেও এর অর্থ আবার এসটিএ থ্রেডের কলগুলি মার্শাল হবে। এটি কারণ কোনও Free
অবজেক্টটি সাধারণত প্রত্যাশা নিয়ে লেখা হয় যা এটি ব্লক করতে পারে।Both
। এই ক্লাসগুলি নমনীয় এবং যে কোনও অ্যাপার্টমেন্ট থেকে তারা তৈরি করেছেন লোড হয়। প্রয়োজনীয়তার দুটি সেট ফিট করার জন্য এগুলি অবশ্যই লিখিত হতে হবে: এমটিএতে লোড হওয়ার ক্ষেত্রে তাদের অবশ্যই তাদের অভ্যন্তরীণ অবস্থাটি সাম্প্রতিক কলগুলির বিরুদ্ধে রক্ষা করতে হবে, তবে তারা কোনও এসটিএতে লোড হওয়ার ক্ষেত্রে অবরুদ্ধ করতে হবে না।.NET ফ্রেমওয়ার্ক থেকে, মূলত কেবলমাত্র [STAThread]
UI তৈরি করে এমন কোনও থ্রেড ব্যবহার করুন। কর্মী থ্রেডগুলি এমটিএ ব্যবহার করা উচিত, যদি না তারা Apartment
চিহ্নযুক্ত সিওএম উপাদানগুলি ব্যবহার না করে, তবে যদি একই উপাদানটিকে একাধিক থ্রেড থেকে কল করা হয় (তবে প্রতিটি থ্রেডের জন্য অপেক্ষা করতে হবে) পরিবর্তে উপাদান)। উপাদানটি এসটিএ বা এমটিএতে রয়েছে কিনা তা আপনি যদি থ্রেড প্রতি আলাদা আলাদা COM অবজেক্ট ব্যবহার করেন তবে চারদিকে এটি অনেক সহজ।
আমি বিদ্যমান ব্যাখ্যাগুলি খুব গব্বলডিগুককে পাই। এখানে সরল ইংরেজিতে আমার ব্যাখ্যা:
STA: যদি কোনও থ্রেড STA তে সেট করা একটি COM অবজেক্ট তৈরি করে (CoCreateXXX কল করার সময় আপনি একটি পতাকা পাস করতে পারেন যা COM অবজেক্টটি STA মোডে সেট করে) তবে কেবল এই থ্রেডই এই COM অবজেক্টটি অ্যাক্সেস করতে পারে (এটি STA এর অর্থ - একক থ্রেডেড অ্যাপার্টমেন্ট) ), এই COM অবজেক্টে পদ্ধতিতে কল করার চেষ্টা করা অন্য থ্রেডটি নীরবে নিঃশব্দে এই থ্রেডে বার্তা প্রেরণ করে যা COM অবজেক্ট তৈরি করে (মালিকানাধীন)। এটি অনেকটা সত্যের মতো যা কেবলমাত্র থ্রেড যা একটি ইউআই নিয়ন্ত্রণ তৈরি করে কেবল এটি সরাসরি অ্যাক্সেস করতে পারে। এবং এই প্রক্রিয়াটি জটিল লক / আনলক অপারেশনগুলি রোধ করার জন্য।
এমটিএ: যদি কোনও থ্রেড এমটিএতে সেট করা একটি সিওএম অবজেক্ট তৈরি করে, তবে প্রতিটি থ্রেডই সরাসরি এতে পদ্ধতি কল করতে পারে।
এটি এর মূল বক্তব্য। যদিও প্রযুক্তিগতভাবে এমন কিছু বিশদ রয়েছে যা আমি উল্লেখ করি নি, যেমন 'এসটিএ' অনুচ্ছেদে, স্রষ্টার থ্রেডটি নিজেই এসটিএ হতে হবে। তবে এসটিএ / এমটিএ / এনএ বুঝতে আপনাকে যা জানার দরকার তা এটি বেশ সুন্দর।
এসটিএ (একক থ্রেডেড অ্যাপার্টমেন্ট) মূলত এমন ধারণা যে একবারে কেবল একটি থ্রেড আপনার কোডের সাথে ইন্টারঅ্যাক্ট করবে। আপনার অ্যাপার্টমেন্টে কলগুলি উইন্ডো বার্তাগুলির মাধ্যমে মার্শেল করা হয় (অ-দৃশ্যমান ব্যবহার করে) উইন্ডো। এটি কলগুলিকে সারিবদ্ধ করার এবং অপারেশনগুলি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করার অনুমতি দেয়।
এমটিএ (মাল্টি থ্রেডেড অ্যাপার্টমেন্ট) যেখানে অনেক থ্রেড সমস্ত একই সাথে কাজ করতে পারে এবং থ্রেড সুরক্ষাটি পরিচালনা করতে বিকাশকারী হিসাবে আপনার উপর নজর রয়েছে।
সিওএম-এ থ্রেডিং মডেলগুলি সম্পর্কে আরও অনেক কিছু শিখতে হবে, তবে সেগুলি কী তা বুঝতে যদি আপনার সমস্যা হয় তবে আমি বলব যে এসটিএ কী এবং এটি কীভাবে কাজ করে তা বোঝা ভাল শুরু করার জায়গা হবে কারণ বেশিরভাগ COM অবজেক্টগুলি STA এর।
অ্যাপার্টমেন্ট অ্যাড্রেস থ্রেডস, যদি কোনও থ্রেড একই অ্যাপার্টমেন্টে অবজেক্টের মতো ব্যবহার করে তবে এটি অ্যাপার্টমেন্টের থ্রেড। আমি মনে করি এটি কেবল একটি COM ধারণা কারণ এটি কেবলমাত্র অবজেক্ট এবং থ্রেডগুলির সাথে কথা বলার একটি উপায় যা তাদের সাথে যোগাযোগ করে ...
প্রতিটি EXE যা COM বা OLE নিয়ন্ত্রণগুলি হোস্ট করে এটির অ্যাপার্টমেন্টের অবস্থানটি সংজ্ঞায়িত করে। অ্যাপার্টমেন্ট রাজ্যটি ডিফল্টভাবে এসটিএ হয় (এবং বেশিরভাগ প্রোগ্রামের জন্য এসটিএ হওয়া উচিত)।
এসটিএ - প্রয়োজনীয়তার সাথে সমস্ত ওএলই নিয়ন্ত্রণ অবশ্যই একটি এসটিএতে থাকতে হবে। এসটিএ মানে আপনার সিওএম-অবজেক্টটি সর্বদা ইউআই থ্রেডে চালিত হওয়া উচিত এবং অন্য থ্রেডগুলিতে পাস করা যায় না (অনেকটা এমএফসি-তে কোনও ইউআই উপাদান হিসাবে)। তবে আপনার প্রোগ্রামটিতে এখনও অনেক থ্রেড থাকতে পারে।
এমটিএ - আপনি আপনার প্রোগ্রামের যে কোনও থ্রেডে COM অবজেক্টটি পরিচালনা করতে পারেন।
আমার বোঝার হিসাবে, 'অ্যাপার্টমেন্ট' বহু-থ্রেডিংয়ের সমস্যা থেকে COM অবজেক্টগুলিকে রক্ষা করতে ব্যবহৃত হয়।
যদি কোনও COM অবজেক্ট থ্রেড-সেফ না থাকে তবে এটি এটি একটি এসটিএ অবজেক্ট হিসাবে ঘোষণা করা উচিত। তারপরে কেবল যে থ্রেড এটি তৈরি করে তারা এটি অ্যাক্সেস করতে পারে। নির্মাণের থ্রেডটি নিজেকে স্টা থ্রেড হিসাবে ঘোষণা করবে। ফণা অধীনে, থ্রেডটি তার টিএলএসে (থ্রেড লোকাল স্টোরেজ) এসটিএ তথ্য সংরক্ষণ করে। থ্রেডটি একটি এসটিএ অ্যাপার্টমেন্টে প্রবেশ করায় আমরা এই আচরণটিকে ডাকি। যখন অন্যান্য থ্রেডগুলি এই COM অবজেক্টটি অ্যাক্সেস করতে চায় তখন এটি তৈরি থ্রেডের অ্যাক্সেসকে মার্শাল করা উচিত। মূলত, তৈরি থ্রেড ইন-সীমাবদ্ধ কলগুলি প্রক্রিয়া করতে বার্তা প্রক্রিয়া ব্যবহার করে।
যদি কোনও COM অবজেক্ট থ্রেড-সেফ থাকে তবে এটি এমটিএ অবজেক্ট হিসাবে ঘোষণা করা উচিত। এমটিএ অবজেক্টটি মাল্টি-থ্রেড দ্বারা অ্যাক্সেস করা যায়।
কোড যা COM অবজেক্ট ডলসকে কল করে (উদাহরণস্বরূপ, মালিকানা ডেটা ফাইলগুলি পড়ার জন্য), কোনও ইউজার ইন্টারফেসে সূক্ষ্মভাবে কাজ করতে পারে তবে কোনও পরিষেবা থেকে রহস্যজনকভাবে ঝুলতে পারে। কারণটি হ'ল নেট নেট ২.০ ব্যবহারকারীর ইন্টারফেসগুলি এসটিএ (থ্রেড-নিরাপদ) ধরেছে যখন পরিষেবাগুলি এমটিএ ধরে নেয় ((তার আগে, পরিষেবাগুলি এসটিএ ধরে নেওয়া হয়েছিল) a