PDA

View Full Version : سوال: تماس با یک کنترل از یک thread دیگه با دو تا delegate



SabaSabouhi
چهارشنبه 16 اردیبهشت 1388, 12:09 عصر
با سلام
در یک فرم، thread جدیدی می‌سازم و متدی از یک کلاس static رو به اون معرفی می‌کنم.
اون thread در شرایطی باید روی فرم من یه تغییری بده. برای این کار به هیچ شکلی نتونستم با یک delegate این کار رو انجام بدم چون ایراد می‌گرفت که برای استفاده (control.invoke) از non-static member باید حتماً از یک instance استفاده کنم.
برای حل این مشکل توی کلاس static خودم یک delegate ساختم و اون رو از توی load فرمم مقدار دهی کردم. اما باز همین ایراد رو می‌گرفت.
وقتی بجای control.invoke ، خود delegate رو به شکل ()myDelegate اجرا می‌کردم هم خطا می‌گرفت که این کنترل تو یه thread ایجاد شده و تو یه thread دیگه نمی‌شه بهش دست زد.

ناچار شدم یه متد تو فرم بسازم، با delegate به کلاس معرفیش کنم. بعد تو همون متد یه delegate دیگه بسازم که متد مربوط به تغییر در فرم رو اجرا کنه. اولی رو به شکل ()myDelegate و دومی رو به شکل control.invoke اجرا کنم. . . . و مشکل حل شد.

اما چرا؟

صبا صبوحی

SabaSabouhi
شنبه 19 اردیبهشت 1388, 14:49 عصر
با سلام
کسی از دوستان نمی‌تونه کمکی کنه؟

صبا صبوحی

govaleshgar2
شنبه 19 اردیبهشت 1388, 18:04 عصر
ای کاش کمی کد میگذاشتید تا بفهمیم که منظورتون چیه؟

البته به گمانم ابزارهایی غیر از Control.Invoke هم هست:متفکر: که کار اون رو ساده تر انجام میده. ولی چون سوال ناقصه من هم جواب ناقص میدهم:لبخند:

SabaSabouhi
دوشنبه 21 اردیبهشت 1388, 14:40 عصر
با سلام
تو کد مربوط به فرم:



delegate void delServerStatus( bool isStarted );
public void ServerStatus2( bool isStarted ) {
delServerStatus myDel = new delServerStatus( ServerStatus );
Invoke( myDel, new object[] { isStarted } );
}
public void ServerStatus( bool isStarted ) {
lblStatus.ImageIndex = isStarted ? 1 : 0;
}




و در کد مربوط به thread دیگه ( که در یک static class قرار داره ):



public static ShowStatusDelegate ShowStatus;
private static bool isStarted {
get { return _isStarted; }
set {
_isStarted = value;
ShowStatus( _isStarted );
}
}



که این ShowStatus در متد load فرم مقدار می‌گیرد به این شکل:



SSPCServer.ShowStatus = new SSPCManager.ShowStatusDelegate( ServerStatus2 );




خودم هم متوجه هستم که ظاهراً یه جایی دارم اشتباه می‌کنم. اما نکته اینه که برنامه کاملاً درست کار می‌کنه. حالا هم دوست دارم بدونم که چرا اینطوری داره کار می‌کنه و هم این که می‌خوام بدونم درستش چطوریه.

با سپاس
صبا صبوحی

esmaeily-hosein
دوشنبه 21 اردیبهشت 1388, 16:06 عصر
این روش درسته .
شاید راه ساده تر این بود که کنترل خودت پاس بدی و یه همچین چیزی مینوشتی .


private delegate void StringDelegate(string text);
public void ThreadMethod(object state)
{
Control c=state as Control;
if (c==null || !(c.IsHandleCreated)) return ;
for (int i = 0; i < 1000000; i++)
{

c.Invoke((StringDelegate)delegate(string s)
{
c.Text = s;
}, i.ToString());

}
}

SabaSabouhi
سه شنبه 22 اردیبهشت 1388, 14:22 عصر
با سلام
از پاسخ‌تون سپاس‌گزارم. همین کار رو انجام دادم و به خوبی جواب داد.
اما حالا اگه نخواهم که یک کنترل درگیر باشه چی؟ یعنی فقط یک متد صدا زده بشه. باید چیکار کنم؟

صبا صبوحی

SabaSabouhi
چهارشنبه 23 اردیبهشت 1388, 16:27 عصر
با سلام
خوب جوابش رو خودم پیدا کنم. خود فرم رو پاس دادم و مشکی پیش نیومد.

صبا صبوحی