কখন পর্যবেক্ষণের ধরণ ব্যবহারের চেয়ে অনুষ্ঠানের পক্ষে পোলিং ভাল হবে?


41

এমন পরিস্থিতিতে কি আছে যেখানে পর্যবেক্ষণের ধরণটি ব্যবহারের চেয়ে ইভেন্টের জন্য ভোট দেওয়া ভাল হবে ? আমার পোলিং ব্যবহারের ভয় রয়েছে এবং যদি কেউ আমাকে একটি ভাল দৃশ্য দেয় তবে এটি ব্যবহার শুরু করব। আমি যতটা ভাবতে পারি তা হল কীভাবে পর্যবেক্ষণের ধরণটি ভোটদানের চেয়ে ভাল। এই দৃশ্যটি বিবেচনা করুন:

আপনি একটি গাড়ী সিমুলেটর প্রোগ্রামিং করছেন। গাড়ী একটি জিনিস। গাড়িটি চালু হওয়ার সাথে সাথেই আপনি একটি "ভ্রুম ভারুম" সাউন্ড ক্লিপ খেলতে চান।

আপনি এটি দুটি উপায়ে মডেল করতে পারেন:

পোলিং : প্রতি সেকেন্ডে গাড়ীর অবজেক্টটি পোল করুন কিনা তা দেখুন। এটি চালু হয়ে গেলে সাউন্ড ক্লিপটি প্লে করুন।

পর্যবেক্ষক প্যাটার্ন : গাড়িটিকে পর্যবেক্ষক প্যাটার্নের বিষয়বস্তু করুন। যখন এটি চালু হয় তখন সমস্ত পর্যবেক্ষকদের কাছে এটি "চালু" ইভেন্টটি প্রকাশ করুন। একটি নতুন সাউন্ড অবজেক্ট তৈরি করুন যা গাড়িটি শুনবে। এটি "চালু" কলব্যাকটি প্রয়োগ করুন, যা সাউন্ড ক্লিপটি চালায়।

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


আমি প্রায় কোন পরিস্থিতিতে চিন্তা করতে পারি। পর্যবেক্ষক প্যাটার্নটি হ'ল প্রকৃত বিশ্ব এবং বাস্তব জীবনের মানচিত্র। সুতরাং আমি মনে করি কোনও দৃশ্য কখনও এটি ব্যবহার না করে ন্যায়সঙ্গত করবে।
সা Saeedদ নেমতি

আপনি কি ইউজার ইন্টারফেস ইভেন্টগুলি বা সাধারণভাবে ঘটনার কথা বলছেন ?
ব্রায়ান ওকলে

3
আপনার উদাহরণটি পোলিং / পর্যবেক্ষণের সমস্যাটি সরিয়ে দেয় না। আপনি কেবল এটি নিম্ন স্তরে পৌঁছেছেন। আপনার প্রোগ্রামটিতে এখনও কোনও মেকানিজম দ্বারা গাড়িটি চালু আছে কি না তা নির্ধারণ করা দরকার।
ডঙ্ক

উত্তর:


55

কল্পনা করুন যে আপনি প্রতিটি ইঞ্জিন চক্র সম্পর্কে বিজ্ঞপ্তি পেতে চান, উদাহরণস্বরূপ ড্রাইভারকে একটি RPM পরিমাপ প্রদর্শন করতে।

পর্যবেক্ষক প্যাটার্ন: ইঞ্জিন প্রতিটি চক্রের জন্য সমস্ত পর্যবেক্ষকদের কাছে একটি "ইঞ্জিন চক্র" ইভেন্ট প্রকাশ করে। এমন শ্রোতা তৈরি করুন যা ইভেন্টগুলি গণনা করে এবং আরপিএম প্রদর্শন আপডেট করে।

পোলিং: আরপিএম ডিসপ্লে ইঞ্জিন চক্র কাউন্টারের জন্য নিয়মিত বিরতিতে ইঞ্জিনকে জিজ্ঞাসা করে, এবং সেই অনুযায়ী আরপিএম প্রদর্শন আপডেট করে।

এই ক্ষেত্রে, পর্যবেক্ষক প্যাটার্নটি সম্ভবত আলগা হবে: ইঞ্জিন চক্রটি একটি উচ্চ-ফ্রিকোয়েন্সি, উচ্চ-অগ্রাধিকার প্রক্রিয়া, আপনি কেবল ডিসপ্লে আপডেট করার জন্য সেই প্রক্রিয়াটি বিলম্ব বা স্টল করতে চান না। আপনি ইঞ্জিন চক্র ইভেন্টগুলির সাথে থ্রেড পুলটি ছিন্ন করতেও চান না।


PS: আমি বিতরণ প্রোগ্রামিংগুলিতেও প্রায়শই ভোটদানের ধরণটি ব্যবহার করি:

পর্যবেক্ষক প্যাটার্ন: প্রসেস এ বি প্রসেস করার জন্য একটি বার্তা প্রেরণ করে যা বলে যে "প্রতিবার কোনও ইভেন্ট ই ঘটে, প্রসেস এ'তে একটি বার্তা প্রেরণ করুন"।

পোলিংয়ের প্যাটার্ন: প্রক্রিয়া এ নিয়মিত বি প্রক্রিয়া করার জন্য একটি বার্তা প্রেরণ করে যা বলে যে "আপনি যদি শেষ বারের মত পোলিংয়ের পরে ই ঘটেন তবে আমাকে এখনই একটি বার্তা প্রেরণ করুন"।

ভোটদানের ধরণটি আরও কিছুটা নেটওয়ার্ক লোড তৈরি করে। তবে পর্যবেক্ষক প্যাটার্নের ডাউনসাইডও রয়েছে:

  • যদি প্রক্রিয়া A ক্র্যাশ হয় তবে এটি কখনই সাবস্ক্রাইব করবে না এবং প্রসেস বি সর্বদা অনন্তকাল ধরে বিজ্ঞপ্তি প্রেরণের চেষ্টা করবে, যদি না এটি নির্ভরযোগ্যভাবে দূরবর্তী প্রক্রিয়া ব্যর্থতা সনাক্ত করতে পারে (করা সহজ কাজ নয়)
  • ইভেন্ট E যদি খুব ঘন ঘন হয় এবং / বা বিজ্ঞপ্তিগুলিতে প্রচুর ডেটা থাকে, তবে প্রক্রিয়া A এটি পরিচালনা করতে পারে তার চেয়ে আরও বেশি ইভেন্টের বিজ্ঞপ্তি পেতে পারে। ভোটদানের ধরণটি সহ, এটি কেবল ভোটদানকে শ্বাসরোধ করতে পারে।
  • পর্যবেক্ষক প্যাটার্নে, উচ্চ লোড পুরো সিস্টেমের মাধ্যমে "রিপলস" তৈরি করতে পারে। আপনি যদি অবরুদ্ধ সকেটগুলি ব্যবহার করেন তবে এই লহরগুলি উভয় পথে যেতে পারে।

1
ভাল যুক্তি. পারফরম্যান্সের জন্য কখনও কখনও এটি আরও ভাল পোল হয়।
ফালকন

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

1
"যদি না এটি নির্ভরযোগ্যভাবে দূরবর্তী প্রক্রিয়া ব্যর্থতাগুলি সনাক্ত করতে পারে (করা সহজ কাজ নয়)" ... ভোটগ্রহণ ব্যতীত; পি। সুতরাং সেখানে সর্বোত্তম নকশা হ'ল "কিছুই পরিবর্তিত হয়নি" যথাসম্ভব প্রতিক্রিয়া হ্রাস করা। +1, ভাল উত্তর।
pdr

2
@ জোজো: আপনি, হ্যাঁ, তবে আপনি আরপিএম কাউন্টারে ডিসপ্লেতে অন্তর্ভুক্ত হওয়া নীতি রাখছেন। সম্ভবত ব্যবহারকারী মাঝেমধ্যে চায় একটি অত্যন্ত সুনির্দিষ্ট আরপিএম প্রদর্শন আছে।
জ্যান লিংস

2
@ জোজো: প্রতিটি 100 তম ইভেন্ট প্রকাশ করা হ্যাক। এটি কেবলমাত্র যদি ইভেন্টের ফ্রিকোয়েন্সি সবসময় সঠিক পরিসরে থাকে তবে ইভেন্টটি প্রসেসিং যদি ইঞ্জিনের জন্য খুব বেশি সময় নেয় না, তবে যদি সমস্ত গ্রাহককে তুলনীয় যথার্থতার প্রয়োজন হয় তবে এটি ঠিকভাবে কাজ করে। আর এটি প্রতি আরপিএমের জন্য একটি মডুলাস অপারেশন নেয়, যা (কয়েক হাজার আরপিএম ধরে নিলাম) প্রতি সেকেন্ডে কয়েকটি পোলিং অপারেশনের চেয়ে সিপিইউয়ের পক্ষে অনেক বেশি কাজ।
নিকি

7

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


7

কোনও সংযোগ ব্যর্থ হতে পারে, সার্ভারগুলি সম্পন্ন হতে পারে এমন সময়ে নেটওয়ার্কে কাজ করার পক্ষে পোলিং করা অনেক সহজ etc. দূরে চলে গেছে.

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

প্রদত্ত সার্ভার খুব স্বল্প ব্যয়ে "কোনও পরিবর্তন নয়" প্রতিক্রিয়া জানাতে পারে এবং আপনি খুব বেশি বার পোল করেন না এবং আপনার ক্লায়েন্টের ভোটদানের সংখ্যা নেই, তবে ভোটদান বাস্তব জীবনে খুব ভাল কাজ করে।

তবে " মেমরির ক্ষেত্রে", সাধারণত স্বল্প কাজ হওয়ায় পর্যবেক্ষক প্যাটার্নটি ব্যবহার করে আমি ডিফল্ট হয়ে যাই।


5

পোলিংয়ের কিছু অসুবিধাগুলি রয়েছে, আপনি মূলত এগুলি ইতিমধ্যে আপনার প্রশ্নে জানিয়েছেন।

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

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


মাল্টি থ্রেডিংয়ের জন্য কেন পোলিং নিরাপদ বলে আপনি নিশ্চিত তা নিশ্চিত নই। বেশিরভাগ ক্ষেত্রে, এটি হবে না। পোল হ্যান্ডলার যখন একটি পোলের অনুরোধ গ্রহণ করে, তখন এটি পোলযুক্ত বস্তুর অবস্থাটি বের করতে হবে, যদি বিষয়টি আপডেট করার মাঝামাঝি থাকে তবে পোল হ্যান্ডলারের পক্ষে এটি নিরাপদ নয়। শ্রোতার দৃশ্যে, কেবলমাত্র পুশার ধারাবাহিক অবস্থায় থাকলে আপনি বিজ্ঞপ্তিগুলি পেতে পারেন, তাই আপনি পোল অবজেক্টের বেশিরভাগ সুসংগত সমস্যা এড়াতে পারবেন।
মিথ্যা রায়ান

4

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

লিনাক্সের জন্য এটি তখন বড় ব্যাপার ছিল যখন নেটওয়ার্কিং স্ট্যাক এনএপিআই সক্ষম করেছিল, এমন একটি নেটওয়ার্কিং এপিআই যা ড্রাইভারদের একটি বাধা মোড (বিজ্ঞপ্তি) থেকে একটি পোলিং মোডে স্যুইচ করার অনুমতি দেয় allowed

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

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

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


2

আমি পোলিং পছন্দ করি! আমি কি? হ্যাঁ! আমি কি? হ্যাঁ! আমি কি? হ্যাঁ! আমি কি এখনও? হ্যাঁ! এখন কি করবে? হ্যাঁ!

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

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

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

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

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

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

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

সমজাতীয় লুপস

ঠিক আছে, আমি একটি দুর্দান্ত মন্তব্য পেয়েছিলাম Josh Caswellযা আমার উত্তরে কিছু বোকামি নির্দেশ করেছে:

"জাগ্রত করতে থ্রেডগুলিকে অবহিত করতে শর্ত ভেরিয়েবলগুলি ব্যবহার করা পছন্দ করুন" মতামত কোনও ইভেন্ট-ভিত্তিক / পর্যবেক্ষক বিন্যাসের মতো, ভোটদান নয়

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

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

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

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

আমি ভোটদানের "নিকটতম" হিসাবে বিবেচনা করছি তা ইভেন্টের সারিটি ব্যবহার করবে না তবে এটি খুব একজাতীয় প্রক্রিয়াকরণকে পিছিয়ে দেবে। একটি PaintSystemকাজ সেখানে পেইন্টিং যে একটি উইন্ডো নির্দিষ্ট গ্রিড কোষ, যে সময়ে আপনার এটা সঠিক Z-অনুক্রমে এটা ভিতরে কোষ এবং repaints সবকিছু মাধ্যমে একটি সহজ অনুক্রমিক লুপ আছে নূতনে রঙ কি করতে একটি শর্ত পরিবর্তনশীল মাধ্যমে সতর্ক করা হতে পারে। এখানে পুনরায় রঙ করা দরকার এমন একটি ঘরে থাকা প্রতিটি উইজেটের পেইন্ট ইভেন্টগুলিকে ট্রিগার করতে এখানে কলিং ইন্ডিয়ারেশন / ডায়নামিক প্রেরণের এক স্তর থাকতে পারে, তবে তা - পরোক্ষ কলগুলির মাত্র একটি স্তর। কন্ডিশন ভেরিয়েবল পর্যবেক্ষণের প্যাটার্নটি ব্যবহার করে PaintSystemযা কাজ করে তা সতর্ক করতে ব্যবহার করে তবে এটি এর চেয়ে বেশি কিছু নির্দিষ্ট করে না এবংPaintSystemএকটি ইউনিফর্মের প্রতি উত্সর্গীকৃত, সেই সময়ে খুব সম্মোহিত কাজ task আমরা যখন PaintSystem'sকোডটি ডিবাগ করছি এবং ট্রেস করছি , তখন আমরা জানি যে পেইন্টিং ব্যতীত আর কিছুই হবে না।

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

আমরা এই ধরণের জিনিসটির জন্য লক্ষ্য রাখছি:

when there's work to do:
   for each thing:
       apply a very specific and uniform operation to the thing

উল্টোদিকে:

when one specific event happens:
    do something with relevant thing
in relevant thing's event:
    do some more things
in thing1's triggered by thing's event:
    do some more things
in thing2's event triggerd by thing's event:
    do some more things:
in thing3's event triggered by thing2's event:
    do some more things
in thing4's event triggered by thing1's event:
    cause a side effect which shouldn't be happening
    in this order or from this thread.

এবং তাই এগিয়ে। এবং এটি প্রতিটি কাজ হিসাবে এক থ্রেড হতে হবে না। একটি থ্রেড GUI নিয়ন্ত্রণগুলির জন্য লেআউট (পুনরায় আকার / পুনর্নির্ধারণ) যুক্তি প্রয়োগ করতে পারে এবং সেগুলি পুনরায় রঙ করতে পারে তবে এটি কীবোর্ড বা মাউস ক্লিকগুলি পরিচালনা করতে পারে না। সুতরাং আপনি এটির জন্য কেবল কোনও ইভেন্টের সারির এককতার উন্নতি হিসাবে দেখতে পারেন। তবে আমাদের কোনও ইভেন্টের সারি এবং ইন্টারলেভের আকার পরিবর্তন এবং চিত্রকর্মের ফাংশনগুলি ব্যবহার করতে হবে না। আমরা যেমন করতে পারি:

in thread dedicated to layout and painting:
    when there's work to do:
         for each widget that needs resizing/reposition:
              resize/reposition thing to target size/position
              mark appropriate grid cells as needing repainting
         for each grid cell that needs repainting:
              repaint cell
         go back to sleep

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

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

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


1
"জাগ্রত করতে থ্রেডগুলিকে অবহিত করতে শর্ত ভেরিয়েবলগুলি ব্যবহার করা পছন্দ করুন" মতামত কোনও ইভেন্ট-ভিত্তিক / পর্যবেক্ষক বিন্যাসের মতো, ভোটদান নয়।
জোশ ক্যাসওয়েল

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

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

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

সুতরাং শর্তটি পরিবর্তনশীল নিজেই জাগ্রত করার জন্য থ্রেডকে অবহিত করার জন্য একটি পর্যবেক্ষক প্যাটার্ন অনুসরণ করে, তবে আমরা "কাজ করার কাজ আছে" এর চেয়ে কোনও তথ্য প্রেরণ করছি না। এবং জেগে ওঠা প্রতিটি সিস্টেম খুব সাধারণ লুপের মধ্যে জিনিসগুলিকে প্রসারণ করতে উত্সর্গীকৃত একটি অতি सजातीय টাস্ক প্রয়োগ করে, একটি ইভেন্ট সারির বিপরীতে যেখানে অ-একজাতীয় কাজ থাকে (এটিতে প্রক্রিয়াজাতকরণের সারগ্রাহী মিশ্রণ থাকতে পারে)।

-4

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


2
এটি এমনকি জিজ্ঞাসিত প্রশ্নের সমাধানের চেষ্টাও করে না, কখন পর্যবেক্ষক নিদর্শন ব্যবহারের চেয়ে ইভেন্টগুলির পক্ষে ভোট দেওয়া ভাল better দেখুন কিভাবে উত্তর দিতে
মশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.