مشاهده نسخه کامل
: کی و کجا از برچست STAThread استفاده کنیم؟
سلام
از برچسب[STAThread] به چه منظور استفاده میشود و کی و کجا و چرا باید به کار برده شود؟
کمی مقدمه:
در سیستم عامل ویندوز Thread ها دارای الگوهای اجرایی مختلفی هستند:
1- حالت single
2- حالت apartment یا همان single threaded aparatment یا STA
3- حالت آزاد یا free threading یا همان حالت multi threaded apartment یا MTA .
4- حالت دوگانه (یعنی هم ساختار apartment و هم free )
حالت signle که مشخص است. یعنی یک پروسس فقط یک سری متد را پشت سر هم اجرا می کند و در این حالت هیچ بحثی از thread های دیگر نیست. بحث الگویی هم برای مدیریت thread ها وجود ندارد. پس مشکلی نیست اما عموما دیگر اینگونه برنامه نویسی نمی شود و می توان آن را به نوعی منسوخ شده نامید. مگر تمرین های (نه پروژه) دانشجویی که با borland c سال 1990 نوشته شود!
حالت STA: در این حالت هر بخش دارای thread مجزای خود می باشد که در نهایت یک کار را انجام میدهند. یک پروسس در این حالت یک thread اختصاصی از سیستم عامل دارد. خوب این پروسس خود thread های منفک تری احتیاج دارد پس الگوی آن این شکلی می شود:(ببخشید بده با word کشیدم!:n07:)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]پس اگر قرار باشد که بین thread ها ارتباطی صورت بگیرد این عمل ساده بوده و مشکلی در آن نیست و سرعت بسیار عالی در این کار وجود دارد.
از طرفی با توجه به اینکه برای دسترسی به اجزای سیستم عامل یا همان API ها باید یک بخش خاصی از پروسس با سیستم عامل ارتباط بگیرد این مدل از همه بهتر است. در واقع یک حالت امن ارتباطی ایجاد می کند. به نوعی دیگر می توان گفت برای ارتباط (Message pass) توابع اجرایی Thread ها این مدل مناسب است. از آنجایی هم که Windows form ها به صورت داخلی از API ها استفاده می کند می بایست ویندوز فرم ها از این نوع باشند. اگر هم نباشند امکان خطا وجود دارد در واقع روند اجرایی آن دچار تزلزل است. در حالتی هم می توان گفت در یک cpu تک هسته ای تک thread که مدل پردازش سیستم عامل آن STA است هیچگاه در یک پروسس Access دوگانه به حافظه وجود نمی آید.
مدل MTA :
همان شبکه بالا را با این مورد در نظر بگیرید که Thread ها مستقیما در بخش های مختلف وجود داشته باشند:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]خوب مشخصا از نظر سرعت سوییچ سیستم عامل سرعت بهتری دارد اما از نظر انتقال پارامتر ها و پیغام ها بین Thread ها باید یک proxy یا درگاه کنترلی به وجود آید که این واسط باعث کند شدن رفتار بین Thread ها می گردد. حال فرض کنید شما در این مدل قصد استفاده از API ها را داشته باشید یا به نحوی از marshal استفاده کنید. مدل حافظه و سوییچ پردازش آن پیچیده میشود و احتمل بروز خطا در حین کار بسیار زیاد می شود.
خوب مدل دوگانه هم که تکلیقش مشخص است. با توجه به اینکه مدیریت این گونه پروسس ها و برنامه نویسی آن زمان بر است به درد کارهای ساده نمی خورد.
نکات:
1- مایکروسافت گفته که windows form فقط STA را پشتیبانی می کند.
2- در صورت نبود tag های مدل thread، فرض بر MTA هست.
3- ارتباطات COM، استفاده از مارشال و API ها با توجه به تعریف میکروسافت فقط در STA امکان پذیر هست.
نکته ی دیگری در ذهن ندارم. متاسفانه شکل های این مباحث در اینترنت موجود نیست لذا ممکن است شکل های من با شکل های پیاده سازی شده سیستم عامل توسط مایکروسافت تفاوت داشته باشد اما امیدوارم منظور را برساند.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.