آژانس هواپیماییexchanging

ارتباط با کنترلهای فرم در thread

شروع موضوع توسط nabegheh95 ‏11 ژانویه 2010 در انجمن Visual C#.Net

  1. nabegheh95

    nabegheh95 کاربر تازه وارد

    تاریخ عضویت:
    ‏26 فوریه 2007
    نوشته ها:
    61
    تشکر شده:
    0
    سلام.
    یک thread ایجاد کرده ام که به درستی کار می کند. اما لازم است که این ترد مقادیر بعضی از کنترلهای text فرم را تغییر دهد.
    اما کنترلهای فرم در تابع thread قابل دسترسی نیستند!

    کد:
    public static void ThreadFunc(object index)
    {
     ...
    }
     
    
    // in main
     tThread = new Thread(ThreadFunc);
     tThread.Start(iIndex);
    من چطور با فرم ارتباط برقرار کنم؟
     
  2. nsh

    nsh Registered User

    تاریخ عضویت:
    ‏19 ژانویه 2006
    نوشته ها:
    681
    تشکر شده:
    4
    محل سکونت:
    i & j : 2 & 3
    دقیقا نمیدونم چی بگم. اما معمولا فرم در ترد جدایی اجرا میشه و به همین خاطر هم اجازه دسترسی های بین تردی داده نمیشه. فکر نکنم بشه. با این همه دقیق نمیدونم
     
  3. alishokr

    alishokr کاربر تازه وارد

    تاریخ عضویت:
    ‏30 مارس 2010
    نوشته ها:
    5
    تشکر شده:
    0
    سلام...
    دات نت طوری طراحی شده که اجازه ی دسترسی به اعضای مرتبط با سایر Thread ها از طریق یه Thread دیگه رو نمیده ...
    اما شما دو راه پیش رو داری:
    1. از BackgroundWorker استفاده کنی.
    2. از پراپرتی InvokeRequired استفاده کنی ...
    به شرح زیر:
    ابتدا یه Delegate تعریف میکنیم که به یه تابع با signature یی مشابه زیر اشاره کنه:
    کد:
    delegate void ButtonTextChanger(string tx);
    
    
    public void ButtonTextChange(string tx)
    {
    	if (this.button1.InvokeRequired)
    	{
    	   ButtonTextChanger bt = ButtonTextChange;
    	   this.button1.Invoke(bt, new object[] {"Hello"};
    	}
    	else
    	{
    	   button1.Text = tx;
    	}
    }
    
    حالا داخل ایونت Click دکمه ای که روی فرم گذاشتیم ، جهت ایجاد یه Thread جدید کد زیر رو میگذاریم:
    کد:
    private void button1_Click(object sender, EventArgs e)
    {
        ButtonTextChanger t = ButtonTextChange;
        t.BeginInvoke("a", null, null);
    }
    
    این کد این امکان رو میده تا بتونی به کنترهای فرم دسترسی داشته باشی...

    موفق باشی...