یلام
نقل قول:
نوشته شده توسط without_all
... چک میکنه اگه ریسمان اصلی ما فعلا کار داره ...
من همچین چیزی نگفتم!
یاداوری ...
نقل قول:
نوشته شده توسط _H2_
کد فوق اول با if ریسمانی که دستورات را اجرا میکند چک میکند.
اگر ریسمان اصلی نباشد شرط برقرار میشود و پیغامی برای ریسمان اصلی گذاشته میشود تا هر وقت فرصت داشت یکبار همین متد (TextReport) با پارامترهالیی که حالا دارد (text) اجرا کند
نقل قول:
آیا اینجا یعنی ریسمان جدید متوقف میشه تا ریسمان اصلی به اینجا مراجعه کنه و بعد از انجام کار ریسمان اصلی ، دوباره ریسمان جدید کارش رو شروع میکنه ؟
همانطور که اشاره ای کردم ...
نقل قول:
نوشته شده توسط _H2_
این کار مثل ان میماند که در اداره ای، کاغذ و پرونده ای را برای پیگیری روی میز یک کارمند قرار دهید تا هر وقت کار نداشت و نوبت این پرونده رسید، این را هم بررسی کند و کارش را انجام دهد.
و خودتان بگذارید و بروید به کارتان برسید
برای سایر ریسمان ها if برقرار میشود و با ان متد خاص BeginInvoke فقط اجرای این تابع(AddFoundSite) به عنوان یک پیغام به صف کارهای ریسمان اصلی اضافه میشود.
سپس ریسمان فعلی یا همان جدید این پیغام را POST میکند و میرود خط بعد را که return است اجرا میکند و بعد هم سایر دستوراتی که در روال بالاسری باید اجرا میشدند.
مثل نامه معمولی که پستچی داخل خانه می اندازد و فوراً میرود.
ریسمان اصلی هم چون کار خاصی ندارد و مدام صف پیغام ها را چک میکند در کسری از ثانیه پیام را پردازش و خودش مجزا این متد AddFoundSite را با پارامترهایی که در نامه(!) بوده اجرا میکند.
نقل قول:
خب فرض میکنیم ریسمان اصلی ما الان بیکار شده و اومده BeginInvoke چیکار میکنه؟ ( مخصوصا پارامتر هاشو من درک نمیکنم) دوباره خود AddFoundSite رو احظار میکنه ؟ یعنی یه حلقه میشه ؟
اگر ریسمان اصلی برنامه باشد، اصلاً هیچگاه if برقرار نمیشود و اصلاً ریسمان اصلی هیچگاه BeginInvoke را اجرا نمیکند.
اصلاً آن if برای فرق گذاشتن بین اجرای دستورات توسط ریسمان اصلی و سایرین بوده
اگر ان if نبود یک حلقه بینهایت میشد.
نقل قول:
if چک میکنه اگه ریسمان اصلی ما فعلا کار داره یه درخواست(required) برای مراجعه به این قسمت
مجدد تاکید میکنم، مطلب فوق مشکل دارد.
InvokeRequired و BeginInvoke کاری که شلوغی و خلوتی و... ندارند! نان وایی که نیست !:31:
if-InvokeRequired ریسمان اصلی را از سایر ریسمانها تشخیص میدهد، همین و تمام!
BeginInvoke هم با هیچ چیز کاری ندارد یک پیغام برای اجرای Shortcut یک متد به انتهای صف کارهای ریسمان اصلی اضافه میکند. همین و تمام!
نباید ما کد رو به این صورت اصلاح کنیم
نقل قول:
public void AddFoundSite(string site)
{
if (this.InvokeRequired)
{
this.Invoke(new OneTextDelegate(this.AddFoundSite), site);
return;
}
else
{
this.txtFoundSite.Text += site + "\r\n";
}
}
بله، این کد هم صحیح است، البته اگر else اضافه شود دیگر نیازی به return نیست.
در واقع return کد من و else کد شما یک عمل را انجام میدهند و وجود یکی از انها کافی است.
else را که میدانید چه میکند؟
return هم هر کجا اجرا شود، پایان اجرای دستورات تابع است و خط بعدی return دیگر اجرا نمیشود.
و در این کد نتیجه یکساینی با else میدهد.
اگر سایر ریسمان کد را اجرا کنند وارد if میشود و کارشان با return (در این محل) تمام میشود
اگر هم ریسمان اصلی اجرا کند که وارد if نمیشود و دستورات پس از ان را اجرا میکند.
کد داخل if همین و ثابت است ولی کد else میتواند بیشتر هم شود ... (مثل آن ListView) میتوان رنگ و فونت و متن و... چندین کنترلر را دستکاری کرد.
در اینجا مزیت کوچک return ان است که اصتلاحاً کدتان زیاد کوهان شتری و تودرتو نمیشود و کد زیبا تر و قابل فهم تری خواهید داشت.
نقل قول:
در ضمن اگه این سولایی که من کردم به شئ گرایی ربطی داره ...
چندان ارتباطی ندارد ...
( البته تفاوت this و base در #C و یا Me و MyBase و MyClass در VB جزء مباحث جالب شی گرایی است و یا همان IList هم ... )
موفق باشید.