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