PDA

View Full Version : دسترسي به كنترل در thread



shima*
چهارشنبه 06 خرداد 1394, 10:42 صبح
با سلام
من يه برنامه نياز دارم كه چند تا ترد را همزمان اجرا كنه و در هر كدام ار اين تردها بايد به تكست و ليبل دسترسي داشته باشه.
از ترد كه استفاده مي كنم خطا ميده.
تردي كه استفاده كردم به صورت زير است:


Thread t = new Thread(SendPing);
t.Start();


(SendPing نام تابعي است كه بايد اجرا شود.)
خطاي برنامه هم به صورت زير است:

Cross-thread operation not valid: Control 'txtResponse' accessed from a thread other than the thread it was created on.

sajaaaaad
چهارشنبه 06 خرداد 1394, 11:52 صبح
خب مهم اینه که توی تابع چی نوشتی.؟؟
txtresponse چیه.؟ اگر تکست باکسه که نیازی به ترد نداری، اون خودش کلی تابع داره که باهاش میشه کار کرد.! احتمالا توی تابع گفتی برو فلان کارو انجام بده، در حالی که هنوز فرمت اصلا شکل نگرفته.! ترد موقعه ای کاربرد داره که مثلا میگم، میخوای همیشه ساعت رو چک کنه و اگر شد ساعت 14 یک عملیاتیو انجام بده.! یا کارای این شکلی.!
.
بازم بنظر من تابعی که نوشتیو بذاری یا دقیقا بگی میخوای چکار کنی راحت تر میشه راهنماییت کرد.!

shima*
چهارشنبه 06 خرداد 1394, 13:08 عصر
ممنون از وقتي كه گذاشتين.
ميخوام برنامه در يك زمان چندتا آهنگ را اجرا كنه و هيچ كدام از آهنگ ها هم قطع نشن!!!
به نظرتون به جاي ترد از تايمر ميتونم استفاده كنم؟

Mahmoud.Afrad
چهارشنبه 06 خرداد 1394, 17:47 عصر
http://barnamenevis.org/showthread.php?384718-%D8%A8%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%D B%8C-%D9%85%D8%AD%D8%AA%D9%88%D8%A7-%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-timer&p=1703727&viewfull=1#post1703727

RmeXXXXXXXXX
چهارشنبه 06 خرداد 1394, 18:43 عصر
در کل شما مجاز نیستید که کنترلی که در ترد اصلی برنامه ایجاد شده رو از ترد دیگری مورد دسترسی قرار بدهید. این خطا برهمین موضوع دلالت داره.
برای این عمل حداقل دو راه وجود داره:

public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = true;
خط انتهایی میگه که دسترسی از ترد دیگه رو چک نکن. بعضی وقتها واقعاً جواب نمیده
اما راهکار دوم

void engine_Sending(int sentBytes, int lenght)
{
if (this.InvokeRequired)// if control accessed across another thread.
{
SenderEngine.dSending tmpDelegate =
new SenderEngine.dSending(this.engine_Sending);
this.Invoke(tmpDelegate, sentBytes, lenght);// breake them and make request mine!
}
else
{
// your action in thread safe
}
}
در این راهکار توسط متد Invoke درخواستی که از طریق ترد دیگه ای اومده را تبدیل به درخواستی در همین ترد (تردی که کنترل وجود داره) تبدیل میکنیم.