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

نام تاپیک: مشکل در ترد ها

  1. #1
    کاربر دائمی آواتار angel_boy013
    تاریخ عضویت
    اردیبهشت 1385
    محل زندگی
    tehran-narmak
    پست
    236

    مشکل در ترد ها

    سلام دوستان عزیز خسته نباشید
    من 1 مشکل مبتدی داشتم برای کار با ترد ها
    کد من این هست
    توی کد اونجا که کامنت گزاشتم error خطا میده من میخوام دو تا پروگس بار با هم پر شن
    ممنون میشم مشکل منو بگید

    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();
    }
    public void bar1()
    {
    for (int i = 0; i <= 100; i++)
    {
    progbar.Value = i; // ERROR MIDE INJA
    Thread.Sleep(100);
    }
    }
    public void bar2()
    {
    for (int j = 0; j <= 100; j++)
    {
    prog2.Value = j;
    Thread.Sleep(100);
    }
    }
    private void btnclick_Click(object sender, EventArgs e)
    {
    //Thread a = new Thread(bar1);
    Thread b = new Thread(bar2);
    // bar1();
    // bar2();
    new Thread(bar1).Start();
    b.Start();

    }



    }

    }



  2. #2

    نقل قول: مشکل در ترد ها

    سلام دوست عزیز
    نگاه دوست عزیز شما باید بجای متعییر progbar.value=i از ی متعییر استفاده کنی.

  3. #3

    نقل قول: مشکل در ترد ها

    برای کار با UI توی MiltiThreading شما باید در نظر داشته باشی که تردی که اون کنترل رو ایجاد کرده می تونه اون رو تغییر بده.

    بنابراین شما باید یک پیغام به ترد اصلی ارسال کنی و اجرا این عمل رو به خودش واگذار کنی.

    برای ارسال پیغام هم معمولا از تابع invoke یا begininvoke استفاده می شه.

    برای نمونه می شه اینجوری عمل کرد:

            delegate void proplus(ProgressBar sender, int i);

    private void setProgress(ProgressBar sender, int i)
    {
    sender.Value = i;
    }


    تعریف یه تابع که اجرای اون رو با delegate ارسال شده به متد invoke به ترد اصلی واگذار می کنیم.
    بعد در هر ترد متد invoke رو صدا می زنی و کار تموم.

            public void bar1()
    {

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

    //progressBar1.Value = i; // ERROR MIDE INJA
    this.Invoke(new proplus(setProgress), new object[] {progressBar1 , i });

    Thread.Sleep(100);

    }

    }

    public void bar2()
    {

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

    //progressBar2.Value = j;
    this.Invoke(new proplus(setProgress), new object[] { progressBar2, j});
    Thread.Sleep(100);

    }

    }

    private void button1_Click(object sender, EventArgs e)
    {
    //Thread a = new Thread(bar1);

    Thread b = new Thread(bar2);

    // bar1();

    // bar2();

    new Thread(bar1).Start();

    b.Start();
    }


    البته ریزه کاری های دیگه ای هم هست که در کارهای جدی تر باید در نظر گرفت.
    به هر حال توی MiltiThreading چالش اصلی شما کار با داده های مشترک است که این مسئله MiltiThreading رو به یکی از سخت ترین مباحث برنامه نویسی تبدیل کرده.
    البته توی دات نت تکنولوژی های جدیدی در این زمینه معرفی شدن که بیان اونها در اینجا نمی گنجه و شاید منظور شما هم این موارد نباشه.

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

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