একটি বার্তা পাম্প কি?


103

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

হালনাগাদ:

আমার প্রোগ্রাম চিকিত্সা রিপোর্ট নম্বর নির্মাণে ব্যবহৃত দুটি টুকরো তথ্য বের করতে প্রচুর সংখ্যক আরটিএফ ফাইলের মধ্য দিয়ে চলে। আরটিএফ-এ ফরম্যাটিং নির্দেশাবলী কীভাবে কাজ করে তা চেষ্টা করার পরিবর্তে, আমি কেবল সেগুলিকে ওয়ার্ডে খোলার সিদ্ধান্ত নিয়েছি এবং সেখান থেকে পাঠ্যটি বাইরে টানব (আসলে জিইআইআই শুরু না করে)। কখনও কখনও, প্রোগ্রামটি একটি ফাইল প্রক্রিয়াকরণের মাঝখানে হিচাপে পড়ে যায় এবং সেই ডকুমেন্টের সাথে একটি ওয়ার্ড থ্রেড সংযুক্ত থাকে (আমাকে এখনও এটি কীভাবে বন্ধ করতে হয় তা বুঝতে হবে)। আমি যখন প্রোগ্রামটি পুনরায় চালিত করেছি, অবশ্যই আমি একটি বিজ্ঞপ্তি পেয়েছি যে সেই ফাইলটি ব্যবহার করে একটি থ্রেড রয়েছে, এবং আমি কি কেবল পঠনযোগ্য অনুলিপিটি খুলতে চাইছি? আমি যখন হ্যাঁ বললাম, ওয়ার্ড জিইউআই হঠাৎ কোথাও থেকে পপ আপ হয়ে যায় এবং ফাইলগুলি প্রক্রিয়া শুরু করে। আমি ভাবছিলাম কেন এমনটি ঘটেছিল;


3
কেন এটি win32 হিসাবে ট্যাগ হয়? - মেসেজ সিস্টেমটি উইন্ডোজ ভি 1 এ ছিল (যা আমার মনে আছে 8 বিট ছিল))
হোগান

উত্তর:


186

একটি বার্তা লুপটি কোডের একটি ছোট অংশ যা কোনও স্থানীয় উইন্ডোজ প্রোগ্রামে বিদ্যমান। মোটামুটি এটি দেখতে দেখতে:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
} 

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

প্রতিটি জিইউআই সক্ষম। নেট প্রোগ্রামের একটি বার্তা লুপ থাকে, এটি অ্যাপ্লিকেশন দ্বারা শুরু হয় un রুন ()।

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

প্রতিটি সিওএম সক্ষম থ্রেড একটি সিওএম অ্যাপার্টমেন্টের অন্তর্গত। দুটি ধরণের রয়েছে, একক থ্রেডেড অ্যাপার্টমেন্ট (এসটিএ) এবং একটি মাল্টি থ্রেড অ্যাপার্টমেন্ট (এমটিএ)। একটি অ্যাপার্টমেন্ট থ্রেডযুক্ত COM বর্গ অবশ্যই একটি STA থ্রেডে তৈরি করা উচিত created আপনি এটি নেট। প্রোগ্রামে ফিরে দেখতে পারবেন, উইন্ডোজ ফর্ম বা ডাব্লুপিএফ প্রোগ্রামের ইউআই থ্রেডের এন্ট্রি পয়েন্টটিতে [স্ট্যাথ্রেড] বৈশিষ্ট্য রয়েছে। অন্যান্য থ্রেডের জন্য অ্যাপার্টমেন্টের মডেলটি থ্রেড.সেট অ্যাপার্টমেন্ট স্টেট () পদ্ধতি দ্বারা সেট করা হয়েছে।

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

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

সম্ভবত আপনি দেখতে পাচ্ছেন কোথায় এটি বাড়ে: হ্যাঁ, যখন কোনও প্রোগ্রাম বার্তা লুপটি কার্যকর করে, এটি নিষ্ক্রিয়। আসল মার্শালিং একটি গোপন উইন্ডো যা COM তৈরি করে তার মাধ্যমে সঞ্চালিত হয়, এটি পোস্টম্যাসেজ ব্যবহার করে সেই উইন্ডোটির উইন্ডো পদ্ধতিটি কোড চালায় কোড ute এসটিএ থ্রেডে। বার্তা লুপটি নিশ্চিত করে যে এই কোডটি চলমান।


খুব সুন্দর এবং বিস্তারিত উত্তর। কেবল যোগ করার জন্য - এখানে মূল এসটিএ নামে একটি বিশেষ এসটিএ রয়েছে যা তৈরি প্রথম এসটিএ। যা আপনার ইউআই থ্রেড দ্বারা তৈরি করা আদর্শভাবে হওয়া উচিত। মূল এসটিএ হ'ল থ্রেডিং মডেলযুক্ত উপাদানগুলি = কোনওটিই তৈরি হয় না your যদি আপনার মূল এসটিএ আপনার ইউআই থ্রেড দ্বারা তৈরি করা না হয় - তবে পুরানো অ্যাক্টিভেক্স নিয়ন্ত্রণগুলি ব্যবহার করার সময় আপনি আকর্ষণীয় বিষয়গুলিতে দৌড়াতে পারেন যার থ্রেডিং মডেলটি নেই।
কুইসভার

12

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

উইকিপিডিয়ায় একটি প্রাথমিক বর্ণনা রয়েছে


আমি বিশ্বাস করি কোনও বার্তা লুপ ব্যতীত উইন্ডোজ অ্যাপ লেখা অসম্ভব, সুতরাং সমস্ত অ্যাপ্লিকেশন ম্যাসেজ পাম্পটি ব্যবহার করে।
হোগান

2
আপনি এগুলি ব্যতীত সাধারণ জিইউআই অ্যাপ্লিকেশনও লিখতে পারেন - উদাহরণস্বরূপ, আপনি নিজের অ্যাপ্লিকেশনটিতে কোনও বার্তা লুপ না রেখে নিজের বার্তা বাক্সগুলি পপআপ করতে পারেন।

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

6

জন কীভাবে উইন্ডোজ সিস্টেম (এবং অন্যান্য উইন্ডো ভিত্তিক সিস্টেমগুলি - এক্স উইন্ডো , মূল ম্যাক ওএস ....) একটি বার্তা সিস্টেমের মাধ্যমে ইভেন্টগুলি ব্যবহার করে অ্যাসিক্রোনাস ব্যবহারকারী ইন্টারফেস প্রয়োগ করে তা নিয়ে কথা বলছেন ।

প্রতিটি অ্যাপ্লিকেশনের পর্দার আড়ালে একটি বার্তা ব্যবস্থা রয়েছে যেখানে প্রতিটি উইন্ডো অন্য উইন্ডো বা ইভেন্ট শ্রোতাদের কাছে ইভেন্টগুলি প্রেরণ করতে পারে - এটি বার্তার কাতারে একটি বার্তা যুক্ত করে প্রয়োগ করা হয়। একটি মূল লুপ রয়েছে যা সর্বদা এই বার্তাটির সারিটি দেখে এবং তারপরে শ্রোতাদের কাছে বার্তা (বা ইভেন্টগুলি) প্রেরণ করে।

মাইক্রোসফ্ট উইন্ডোজে উইকিপিডিয়া নিবন্ধ বার্তা লুপটি একটি মৌলিক উইন্ডোজ প্রোগ্রামের উদাহরণ কোডটি দেখায় - এবং আপনি দেখতে পারেন যে প্রাথমিক স্তরের একটি উইন্ডোজ প্রোগ্রামটি কেবল "বার্তা পাম্প"।

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


6

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

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

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

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


1
আপনার উত্তরে কয়েকটি ভুলত্রুটি রয়েছে। এখানে 3 ধরণের অ্যাপার্টমেন্ট রয়েছে - এসটিএ (একক থ্রেডেড), এমটিএ (মাল্টি থ্রেডেড) এবং এনটিএ (নিউট্রাল থ্রেডেড)। ফ্রি থ্রেডেড এমন কোনও উপাদানকে বর্ণনা করতে ব্যবহৃত হয় যা ফ্রি থ্রেডেড মার্শালারকে একত্রিত করে, ফ্রি থ্রেডেড অ্যাপার্টমেন্টের মতো কোনও জিনিস নেই। COM STAs এর সাথে যোগাযোগের জন্য বার্তাগুলি ব্যবহার করে। এমটিএতে বসবাসকারী উপাদানগুলির জন্য (বা যা মুক্ত থ্রেডযুক্ত মার্শালারকে একত্রিত করে) কোনও বার্তা লুপের প্রয়োজন নেই। আফাইক - এলপিসি আরপিসি থ্রেড পুল থেকে থ্রেড কল করা থেকে কোনও থ্রেডে ডেটা মার্শাল করতে ব্যবহৃত হয় যা পরে পদ্ধতিটি আহ্বান করে।
কুইসভার


0

আমি মনে করি যে এই চ্যানেল 9 আলোচনার একটি সুন্দর পারস্পরিক ব্যাখ্যা রয়েছে:

উইন্ডো যোগাযোগের এই প্রক্রিয়াটি তথাকথিত উইন্ডোজ বার্তা পাম্প দ্বারা সম্ভব হয়েছে। মেসেজ পাম্পটিকে এমন একটি সত্তা হিসাবে ভাবুন যা অ্যাপ্লিকেশন উইন্ডো এবং ডেস্কটপের মধ্যে সহযোগিতা সক্ষম করে।


2
বাহ ... এটি একটি ভয়ঙ্কর এবং বিভ্রান্তিমূলক উক্তি। (একটি "সত্তা"? এর .. না।)
হোগান

4
সত্তা - অবজেক্ট: এমন কিছু যা একক পৃথক অবজেক্ট হিসাবে উপস্থিত বা হিসাবে বিবেচিত encarta.msn.com/dictionary_1861608661/entity.html
ম্যাথু চুনকাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.