تبلیغات

تابع thread در Processing – ایجاد سریع یک Thread

تابع thread در Processing، این اجازه را می‌دهد تا به سادگی بخشی از کد را درون یک Thread جدید اجرا کنیم! اگر با مفهوم تردها در برنامه نویسی آشنایی داشته باشید (و البته با آنها در جاوا کار کرده باشید)، درک این مطلب ساده است.

اسکچ‌های پروسسینگ، یک توالی خاصی از مراحل مختلف را پشت سرهم دنبال می‌کنند. مثلا تابع setup() در ابتدا اجرا شده و سپس تابع draw() پشت سر آن بارها و بارها در یک حلقه اجرا می‌شود. حالا یک ترد نیز یک سری از مراحل است که شامل نقطه‌ی شروع، وسط و پایان می‌باشد! لذا یک اسکچ در پروسسینگ، یک ترد تنها (single thread) است؛ که به آن ترد اصلی گفته می‌شود و البته در پروسسینگ، ترد Animation نیز نام دارد.

توالی تردهای دیگر، می‌توانند به طور مستقل از حلقه‌ی ترد اصلی اجرا شوند. و به عبارتی، شما می‌توانید هرچند تا ترد که می‌خواهید را در یک زمان اجرا کرده و همه‌ی آنها به صورت همزمان (concurrently) به فعالیت خود ادامه خواهند داد.

توجه داشته باشید که شما نمی‌توانید چیزی را درون صفحه از طریق یک ترد دیگری ترسیم کنید! و به عبارتی، وظیفه‌ی ترسیم روی صفحه بر عهده‌ی ترد اصلی است. (این موارد را بایستی از خود جاوا به یاد داشته باشید).

از تردها معمولا زمانی استفاده می‌کنیم که قرار است یک کار سنگین دیگری را انجام دهیم و نمیخواهیم در آن لحظه، فعالیت صفحه متوقف شود! چرا که اگر ترد اصلی به انجام یک وظیفه‌ی سنگینی مثل دانلود فایل یا خواندن و پردازش یک فایل سنگینی بپردازد، صفحه نمایش برنامه قفل خواهد شد و برنامه تا اتمام آن فرآیند به هیچ چیزی پاسخ‌گو نخواهد بود! (نمونه‌ی بارز، نرم افزار دانلود منیجر که برای دانلود از یک ترد جدید استفاده می‌شود)

در Processing، می‌توان اجرای یک تابعی که خودمان نوشته‌ایم را به یک thread سپرد و زمانی که اجرای آن به اتمام رسید، می‌توان توسط یک متغیر سراسری مشخص کرد که کار ترد تمام شده است و سپس داخل draw، آن متغیر را بررسی کرده و بقیه کار را انجام داد!

البته خود Processing نیز درون هسته‌ی خود به میزان زیادی از تردها استفاده کرده است؛ از جمله تابع captureEvent() و movieEventt().

توجه
تابع thread تنها یک راه سریع برای ایجاد یک ترد در Processing بوده  که در واقع از کلاس Thread جاوا استفاده می‌کند. بنابراین ما می‌توانیم خودمان نیز از این کلاس استفاده کنیم.

راهنما

سینتکس و ساختار حالت‌های مختلف تابع:

thread(name)

ورودی‌ها:

  • name (از نوع String): نام تابعی که می‌خواهیم در یک ترد جدیدی اجرا شود.

خروجی: void (ندارد)

مثال‌ها

مثال 1: در اینجا قصد داریم تا زمان فعلی را از یک وب سرویسی دریافت کرده و در صفحه نمایش دهیم؛ تا یک ساعت آنلاین بسازیم. لذا پس از هر 30 فریمی که می‌گذرد، تابع requestData را درون یک ترد جدیدی اجرا می‌کنیم. سپس این تابع، یک آبجکت جیسونی را  از یک وب سرویسی می‌گیرد که این آبجکت جیسون، شامل زمان فعلی نیز می‌باشد؛ سپس زمان را درون یک متغیر سراسری به نام time می‌ریزیم و درون draw آن را نمایش می‌دهیم! بنابراین اگر تابع requestData مدت زیادی طول بکشد تا اجرا شود، مشکلی در اجرای کد داخل draw به وجود نخواهد آمد و این دو به طور مستقلی عمل می‌کنند!

توجه داشته باشید که اگر ما loadJSONObject را مستقیما داخل draw بنویسیم، ممکن است زمان زیادی برای گرفتن اطلاعات از اینترنت طول کشیده و برنامه هنگ کند! اما وظیفه‌ی گرفتن اطلاعات را به یک ترد دیگری واگذار کردیم تا ترد اصلی بتواند صفحه را به نرمی نمایش دهد. و همچنین ممکن است پس از گذشت 30 فریم، هنوز ترد قبلی در حال گرفتن اطلاعات از وب سرویس باشد و با اینحال ترد جدیدی نیز اجرا شود! که مشکلی را به وجود نخواهد آورد.


مثال 2: حالا ببیایید یک کرونومتر ساده بسازیم که در هر ثانیه عدد آن افزایش یابد و این عدد را روی صفحه، نمایش دهیم! لذا می‌توان همانند قبل، تابعی را درون یک ترد جدیدی اجرا کرد! و ما در کد زیر، فقط یک بار تابع chronometer را درون setup و داخل یک ترد جدیدی اجرا می‌کنیم. این تابع، داخل خود، یک حلقه‌ی بی‌نهایت دارد که عدد متغیر secs  (ثانیه‌های گذشته) را یک واحد یک واحد افزایش می‌دهد؛ منتها، بعد از هربار افزایش، ترد به مدت یک ثانیه (1000 میلی ثانیه)، توسط دستور Thread.sleep متوقف می‌شود تا مقدار متغیر به صورت ثانیه‌ای افزایش یابد! همچنین، از آن جهت که خطای InterruptedException  ممکن است در زمان توقف ترد مبنا بر قطع شدن کامل ترد رخ دهد، ما در صورت بروز این خطا، همان chronometer را مجددا در یک ترد جدیدی اجرا کرده‌ایم:

البته تمامی موارد، بستگی به چیزیست که نیاز داریم؛ مثلا در بالا می‌توان حلقه را همواره برابر true قرار نداد و برای آن روی صفحه، گزینه توقف و ادامه ایجاد کرد! که کار ساده‌ایست.

مرتبط

  • setup()
  • setup()
  • loop()
  • loop()
تبلیغات
0
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه 😁)

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه