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

نام تاپیک: خطا در thread

  1. #1

    خطا در thread

    سلام
    میخوام اطلاعات و دیتای داخل کلیپ برد رو داخل لیست ویو نمایش بدم و بعد اطلاعات از لیست ویو خونده بشه و انتقال فایل انجام بشه تا در صورت لزوم بتونم مثلا یه ایتم رو حذف کنم و از صف انتقال delete کنم یعنی حتی زمانی که انتقال فایل در thread در حال انجام هست و thread در حال اجرا هست شاید بخوام یه ایتم رو حذف کنم مطمئنا باید از delegate استفاده کرد اما نمیدونم چطوری!!! چون فعلا این پیغام رو میده
    Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on [duplicate]


    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {




    // list_of_file.Invoke.(new UpdateUIDelegate(Updatereplist));
    var dest = Path.GetFullPath(txt_usercontrol.Text ");
    var list = new List<KeyValuePair<string, string>>();
    foreach (object item in list_of_file.Items)
    {


    list.Add(new KeyValuePair<string, string>(item.ToString(), dest));
    }

    for (var i = 0; i < list.Count; i++)

    {
    if (Directory.Exists(list[i].Key))
    {
    var destFolder = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
    if (Directory.Exists(destFolder) == false)
    {
    Directory.CreateDirectory(destFolder);
    }
    foreach (var file in Directory.GetFiles(list[i].Key))
    {

    list.Add(new KeyValuePair<string, string>(file, destFolder));


    }
    foreach (var folder in Directory.GetDirectories(list[i].Key))
    {
    list.Add(new KeyValuePair<string, string>(folder, destFolder));
    }
    }
    else if (File.Exists(list[i].Key))
    {

    var destFile = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
    Copy(list[i].Key, destFile);
    }

    }
    }


  2. #2

    نقل قول: خطا در thread

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    سلام
    میخوام اطلاعات و دیتای داخل کلیپ برد رو داخل لیست ویو نمایش بدم و بعد اطلاعات از لیست ویو خونده بشه و انتقال فایل انجام بشه تا در صورت لزوم بتونم مثلا یه ایتم رو حذف کنم و از صف انتقال delete کنم یعنی حتی زمانی که انتقال فایل در thread در حال انجام هست و thread در حال اجرا هست شاید بخوام یه ایتم رو حذف کنم مطمئنا باید از delegate استفاده کرد اما نمیدونم چطوری!!! چون فعلا این پیغام رو میده
    Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on [duplicate]


    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {




    // list_of_file.Invoke.(new UpdateUIDelegate(Updatereplist));
    var dest = Path.GetFullPath(txt_usercontrol.Text ");
    var list = new List<KeyValuePair<string, string>>();
    foreach (object item in list_of_file.Items)
    {


    list.Add(new KeyValuePair<string, string>(item.ToString(), dest));
    }

    for (var i = 0; i < list.Count; i++)

    {
    if (Directory.Exists(list[i].Key))
    {
    var destFolder = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
    if (Directory.Exists(destFolder) == false)
    {
    Directory.CreateDirectory(destFolder);
    }
    foreach (var file in Directory.GetFiles(list[i].Key))
    {

    list.Add(new KeyValuePair<string, string>(file, destFolder));


    }
    foreach (var folder in Directory.GetDirectories(list[i].Key))
    {
    list.Add(new KeyValuePair<string, string>(folder, destFolder));
    }
    }
    else if (File.Exists(list[i].Key))
    {

    var destFile = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
    Copy(list[i].Key, destFile);
    }

    }
    }

    فرض کنیم که یک textBox1.Text ای هست که در نخی که Worker_DoWork رو فراخوانی می کنه مقدارش رو می خواهید تغییر بدهید.

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    textBox1.Text = "test";
    }

    که دسترسی با خطا روبرو میشه.
    و با Invoke میشه انجامش رو به نخ اصلی واگذار کرد :

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    SetText(textBox1, "test");
    }

    private delegate void SetTextDelegate(Control ctl, string text);

    private void SetText(Control ctl, string text)
    {
    if (ctl.InvokeRequired)
    {
    ctl.Invoke(new SetTextDelegate(SetText), ctl, text);
    }
    else
    {
    ctl.Text = text;
    }
    }


    یا فرضا یک متدی رو در اجرا می کنید که کاری رو انجام میده که باید حتما در نخ اصلی انجام بشه چون در غیر اینصورت خطای عدم دسترسی رخ میده :

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    Updatereplist();
    }

    private void Updatereplist()
    {
    textBox1.Text = "test";
    }

    پس با Invoke اجرایش را به نخ اصلی واگذار می کنید:

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    Updatereplist();
    }

    private void Updatereplist()
    {
    if (InvokeRequired)
    {
    Invoke(new UpdatereplistDelegate(Updatereplist));
    return;
    }
    textBox1.Text = "test";
    }

    private delegate void UpdatereplistDelegate();

  3. #3

    نقل قول: خطا در thread

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    فرض کنیم که یک textBox1.Text ای هست که در نخی که Worker_DoWork رو فراخوانی می کنه مقدارش رو می خواهید تغییر بدهید.

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    textBox1.Text = "test";
    }

    که دسترسی با خطا روبرو میشه.
    و با Invoke میشه انجامش رو به نخ اصلی واگذار کرد :

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    SetText(textBox1, "test");
    }

    private delegate void SetTextDelegate(Control ctl, string text);

    private void SetText(Control ctl, string text)
    {
    if (ctl.InvokeRequired)
    {
    ctl.Invoke(new SetTextDelegate(SetText), ctl, text);
    }
    else
    {
    ctl.Text = text;
    }
    }


    یا فرضا یک متدی رو در اجرا می کنید که کاری رو انجام میده که باید حتما در نخ اصلی انجام بشه چون در غیر اینصورت خطای عدم دسترسی رخ میده :

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    Updatereplist();
    }

    private void Updatereplist()
    {
    textBox1.Text = "test";
    }

    پس با Invoke اجرایش را به نخ اصلی واگذار می کنید:

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    Updatereplist();
    }

    private void Updatereplist()
    {
    if (InvokeRequired)
    {
    Invoke(new UpdatereplistDelegate(Updatereplist));
    return;
    }
    textBox1.Text = "test";
    }

    private delegate void UpdatereplistDelegate();
    خب الان مشکل عدم دسترسی حل شد فقط 2 تا مورد هستش یکی اینکه زمانیکه انتقال فایل میخواد انجام بشه پروگرس بار فقط یه بار پر میشه !! قبلا اطلاعات از stringcollection دریافت میشد اما الان که از لیست ویو خونده میشه این مشکل به وجود اومده و میخوام باز هم مثل قبل هر ایتم که در حال انتقال هست داخل پروگرس بار نمایش داده بشه !!!
    مورد بعد هم اینکه کلا ایتم هایی که قرار هست کپی بشن اول داخل لیست ویو نمایش داده میشن و بعد اگر استارت زده بشه انتقال فایل انجام میشه !!حالا در همین حین مثلا اگر خواسته باشیم ایتم سوم حذف بشه چطور باید عمل کرد ؟ نا گفته نماند کدی که نوشتم اینطوری هست که اگر ایتم انتخاب شده حذف شد اون متد Updatereplist() فراخوانی بشه که البته درست عمل نمیکنه!!


    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
    Updatereplist();

    for (int i = 0; i < 100; i++)
    {


    locker.WaitOne();
    Thread.Sleep(100);
    worker.ReportProgress(i);


    if (worker.CancellationPending)
    {
    e.Cancel = true;
    worker.ReportProgress(0);
    return;
    }

    }

    // list_of_file.Invoke.(new UpdateUIDelegate(Updatereplist));

    }

    private void Updatereplist()
    {

    if (list_of_file.InvokeRequired)
    {
    Invoke(new UpdatereplistDelegate(Updatereplist));
    return;
    }



    var dest = Path.GetFullPath(txt_usercontrol.Text + "/" + "HiradMedia");
    var list = new List<KeyValuePair<string, string>>();
    for (int i = 0; i < list_of_file.Items.Count; i++)
    {

    // MessageBox.Show(list_of_file.Items[i].Text);
    list.Add(new KeyValuePair<string, string>(list_of_file.Items[i].Text, dest));
    }
    /* foreach (string item in list_of_file.Items)
    {

    // MessageBox.Show(item.ToString());
    list.Add(new KeyValuePair<string, string>(item, dest));

    }*/

    for (var i = 0; i < list.Count; i++)

    {

    if (Directory.Exists(list[i].Key))
    {
    var destFolder = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));

    if (Directory.Exists(destFolder) == false)
    {
    Directory.CreateDirectory(destFolder);
    }
    foreach (var file in Directory.GetFiles(list[i].Key))
    {

    list.Add(new KeyValuePair<string, string>(file, destFolder));


    }
    foreach (var folder in Directory.GetDirectories(list[i].Key))
    {
    list.Add(new KeyValuePair<string, string>(folder, destFolder));
    }
    }
    else if (File.Exists(list[i].Key))
    {

    var destFile = Path.Combine(list[i].Value, Path.GetFileName(list[i].Key));
    Copy(list[i].Key, destFile);

    }

    }



    }
    private delegate void UpdatereplistDelegate();
    private void Copy(string source, string destination)
    {
    // MessageBox.Show(destination.ToString());

    int array_length = (int)Math.Pow(2, 19);
    byte[] dataArray = new byte[array_length];
    /* using (FileStream fsread = new FileStream
    (source, FileMode.Open, FileAccess.Read, FileShare.None, array_length))*/
    using (var fsread = File.OpenRead(source))
    // using (var fsin = File.OpenRead(source, FileMode.Open, FileAccess.Read, FileShare.None, array_length))
    {
    using (BinaryReader bwread = new BinaryReader(fsread))
    {
    using (FileStream fswrite = new FileStream
    (destination, FileMode.Create, FileAccess.Write, FileShare.None, array_length))
    {
    using (BinaryWriter bwwrite = new BinaryWriter(fswrite))
    {
    for (; ; )
    {
    int read = bwread.Read(dataArray, 0, array_length);
    if (0 == read)
    break;
    bwwrite.Write(dataArray, 0, read);
    worker.ReportProgress((int)(fsread.Position * 100 / fsread.Length));

    if (worker.CancellationPending)
    {
    // e.Cancel = true;
    worker.ReportProgress(0);
    fsread.Close();
    fsread.Close();
    return;
    }

    }
    }
    }
    }
    }
    // File.Delete(source);


    }

  4. #4

    نقل قول: خطا در thread

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

تاپیک های مشابه

  1. ارسال هم زمان نتایج دو یا چند Thread ، به Main Thread
    نوشته شده توسط مهران رسا در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 19
    آخرین پست: پنج شنبه 01 اردیبهشت 1390, 18:46 عصر
  2. سوال: thread.pause -> thread.abort -> ERROOOOR
    نوشته شده توسط black_wear در بخش C#‎‎
    پاسخ: 7
    آخرین پست: دوشنبه 26 اسفند 1387, 13:14 عصر
  3. سوال: دسترسی به اشیاء یک Thread از داخل Thread دیگر
    نوشته شده توسط bah_jaf در بخش VB.NET
    پاسخ: 1
    آخرین پست: چهارشنبه 29 آبان 1387, 20:35 عصر
  4. مقاله: Thread در جاوا (قسمت دوم:ایجاد ترد با استفاده از روش بسط کلاس Thread)
    نوشته شده توسط manvaputra در بخش برنامه‌نویسی جاوا
    پاسخ: 0
    آخرین پست: جمعه 29 شهریور 1387, 03:28 صبح
  5. دسترسی به یک Thread از یک Thread دیگر
    نوشته شده توسط Xcalivorse در بخش C#‎‎
    پاسخ: 3
    آخرین پست: یک شنبه 30 تیر 1387, 08:59 صبح

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

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