نمایش نتایج 1 تا 7 از 7

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

  1. #1
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

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

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

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

    اما چرا؟

    صبا صبوحی

  2. #2
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

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

    با سلام
    کسی از دوستان نمی‌تونه کمکی کنه؟

    صبا صبوحی

  3. #3

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

    ای کاش کمی کد میگذاشتید تا بفهمیم که منظورتون چیه؟

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

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

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

    با سلام
    تو کد مربوط به فرم:

    delegatevoiddelServerStatus( bool isStarted );
    publicvoid ServerStatus2( bool isStarted ) {
    delServerStatus myDel = newdelServerStatus( ServerStatus );
    Invoke( myDel,
    newobject[] { isStarted } );
    }
    publicvoid ServerStatus( bool isStarted ) {
    lblStatus.ImageIndex = isStarted ? 1 : 0;
    }

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

    publicstaticShowStatusDelegate ShowStatus;
    privatestaticbool isStarted {
    get { return _isStarted; }
    set {
    _isStarted =
    value;
    ShowStatus( _isStarted );
    }
    }
    که این ShowStatus در متد load فرم مقدار می‌گیرد به این شکل:

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

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

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

  5. #5
    کاربر دائمی آواتار esmaeily-hosein
    تاریخ عضویت
    مهر 1385
    محل زندگی
    شهر دودها
    پست
    227

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

    این روش درسته .
    شاید راه ساده تر این بود که کنترل خودت پاس بدی و یه همچین چیزی مینوشتی .
    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());

    }
    }

  6. #6
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

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

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

    صبا صبوحی

  7. #7
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

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

    با سلام
    خوب جوابش رو خودم پیدا کنم. خود فرم رو پاس دادم و مشکی پیش نیومد.

    صبا صبوحی

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •