PDA

View Full Version : حرفه ای: عدم درست کار نکردن چند نخی



morteza_carefree
پنج شنبه 12 خرداد 1390, 10:24 صبح
سلام دوستان من تو برنامه خودم از چند نخی استفاده میکنم و میخوام که هنگام اجراش از پروگرس بار استفاده کنم برنامه رو اینطوری تعریف کردم

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace thread
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread t1;
ThreadStart ts;
private void b()
{
Label l = new System.Windows.Forms.Label();
l.AutoEllipsis = true;
l.AutoSize = true;
l.Location = new System.Drawing.Point(48, 64);
l.Size = new System.Drawing.Size(35, 13);
this.Controls.Add(l);
int i=0;
while (true)
{

l.Text = i.ToString();
Thread.Sleep(100);
}
}
private void button1_Click(object sender, EventArgs e)
{
ts = new ThreadStart(b);
t1 = new Thread(ts);
t1.Start();
}
}
}

اما میگه ترد اجازه دسترسی به اشیا فرم رو نداره تو برنامه بالا هم یه lable جدید ایجاد کردم بازم میگه دسترسی ندارم
مشکلم توکجاست میشه راهنمایی کنید
ممنون میشم

saman6384
پنج شنبه 12 خرداد 1390, 10:37 صبح
شما باید FORM.CONTROL ات رو وقتی میخوای تویه ترد دیگه دسترسی داشته باشی INVOKE کنی!

haghft
پنج شنبه 12 خرداد 1390, 10:41 صبح
آقا قبل اینکه تاپیک بزنید خواهشا یه سرچ تو سایت بکنید.با تشکر.اینم راه حلت:
Invoke(new MethodInvoker(delegate {کدی که دیباگر روش ارور میده}));

saman6384
پنج شنبه 12 خرداد 1390, 10:59 صبح
آقای haghft میشه لطفا تفاوت کدی که نوشتی رو با این کد پایین بفرمایید؟:متفکر:


delegate void texttotextbax(string str);
private void _texttotextbox(string str)
{
if (textBox1.InvokeRequired)
{
texttotextbax text = new texttotextbax(_texttotextbox);
textBox1.Invoke(text, str);
}
else
textBox1.Text = str;

}

haghft
پنج شنبه 12 خرداد 1390, 11:43 صبح
تفاوتی در عملکرد نداره ولی وقتی چند کنترل بکار بیاید دیگه درست نیست برای هر کدومش یه if بنویسید.یه نکته دیگم که هست اون کدی که من نوشتم میشه بهش اصلا یه متد رو معرفی کرد و مخصوص یک آبجکت نیست ولی اگر کار ساده باشه(یعنی برای یک آبجکت) روش شما بهتره.

saman6384
پنج شنبه 12 خرداد 1390, 11:50 صبح
یه چیزی که به نظر خودم رسید!!

دقیق نمی دونم!
اما فکر کنم تو روش من هی داره از DELEGATE نمونه تعریف میشه!
اما تو روش شما نه!

اگه درس فکر کرده باشم روش من بدترین روشه!!

نظر شما چیه؟

haghft
پنج شنبه 12 خرداد 1390, 12:00 عصر
نه اتفاقا فقط هنگامی که نیاز باشه این کارو میکنه.میگم روشی که من به کار بردم جامعتره و برای چند آبجکت و یا یک متد بکار میره اما روش شما برای کارهای ساده یه جورایی شاید بهتر باشه و کار اشتباهی نیست.

saman6384
پنج شنبه 12 خرداد 1390, 12:10 عصر
تست کردم
گذاشتمش تو یه حلقه WHILE
BREAKPOINT گذاشتم رویه خط سازنده DELEGATE ، هر سری که حلقه لوپ میزد این نمونه هم ساخته میشد!

haghft
پنج شنبه 12 خرداد 1390, 12:22 عصر
تست کردم
گذاشتمش تو یه حلقه WHILE
BREAKPOINT گذاشتم رویه خط سازنده DELEGATE ، هر سری که حلقه لوپ میزد این نمونه هم ساخته میشد!
روش منو میگید یا روش خودتونو؟

saman6384
پنج شنبه 12 خرداد 1390, 12:35 عصر
تو روش شما که هر دفه که تابع INVOKE اجرا و کارش تموم میشه DELEGATE هم DISPOSE میشه!!

اما تو روش من هر دفه که DELEGATE ساخته میشه! باقی میمونه و از بین نمیره!!
البته اگه من درس مفهوم DELEGATE رو فهمیده باشم!!