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

نام تاپیک: یوزر کنترل

  1. #1

    یوزر کنترل

    سلام دارم یه اپ انتقال فایل مینویسم میخواستم بدونم چطوری میشه زمانی که چندتا انتقال باهم به صورت همزمان در حال اجرا هستن.. داخل یه فرم زیر هم نمایش داده بشن مثل teracopy ...
    میخواستم ببینم باید از یوزر کنترل استفاده کرد؟ راهکار چیه ممنون میشم راهنمایی کنید

  2. #2

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    سلام دارم یه اپ انتقال فایل مینویسم میخواستم بدونم چطوری میشه زمانی که چندتا انتقال باهم به صورت همزمان در حال اجرا هستن.. داخل یه فرم زیر هم نمایش داده بشن مثل teracopy ...
    میخواستم ببینم باید از یوزر کنترل استفاده کرد؟ راهکار چیه ممنون میشم راهنمایی کنید
    بستگی داره که فقط نمایش ظاهر اش رو بخواهید یا بخواهید اجزاء داخلی ای داشته باشه که کاربر باهاش تعامل داشته باشه.
    طراحی UserControl یا هر کلاس Control دیگری برای وقتی که میخواهید بجز نمایش ظاهر تعامل با کاربر هم داشته باشید (مثلا با دکمه هایی روال رو متوقف کنید) مناسبه.
    اما اگر صرفا می خواهید ظاهر رو نمایش بدهید نیازی نیست که برایش کنترل اختصاصی بسازید، تغییر دادن ظاهر یک Panel یا PictureBox یا ListBox و ... کفایت می کنه.
    مثلا در این پست صرفا نمایش ظاهر رو میخواستم :
    سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان
    اما اینجا تعامل با کاربر هم هست :
    مشکل تایمر در لیست ویو

  3. #3

    نقل قول: یوزر کنترل

    اره دقیقا کاربر باید بتونه تعامل داشته باشه مثلا انتقال رو متوقف کنه یا... ممنون بابت سورسی که فرستادین فقط من میخوام یوزر کنترلی که به toolbox اضافه کردم رو ازش استفاده کنم یه تکست باکس داره یه پروگرس بار و دوتا باتن که برای start و stop هستن اینطوری میتونم از این سورس کمک بگیرم؟و اینکه چطور میشه به ایتمهای این کنترل دسترسی پیدا کرد؟
    آخرین ویرایش به وسیله qasemf : دوشنبه 17 آذر 1399 در 01:57 صبح

  4. #4

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    اره دقیقا کاربر باید بتونه تعامل داشته باشه مثلا انتقال رو متوقف کنه یا... ممنون بابت سورسی که فرستادین فقط من میخوام یوزر کنترلی که به toolbox اضافه کردم رو ازش استفاده کنم یه تکست باکس داره یه پروگرس بار و دوتا باتن که برای start و stop هستن اینطوری میتونم از این سورس کمک بگیرم؟و اینکه چطور میشه به ایتمهای این کنترل دسترسی پیدا کرد؟
    بله. فرض کنید که شما از کلاس کنترل دست ساز تون چند تا متغیر مثلا با اسامی x و y و z دارید و در هر کدوم یک شیء هست. همون موقع x.Name و y.Name و z.Name رو مشخص می کنید تا کنترل ها اسم خودشون داشته باشند، مثلا با اسامی "X" و "Y" و "Z" یا هر نام دلخواه دیگری.
    حالا فرضا اون کنترل های x و y و z رو داخل کنترل دیگری مثل flowLayoutPanel1 یا panel1 یا groupBox1 یا ... قرار داده اید.
    اون اسم ها کمک می کنه که راحت کنترل رو پیدا کنید، مثلا با flowLayoutPanel1.Controls["X"] و panel1.Controls["X"] و ... به کنترل x دسترسی دارید.
    یعنی از روی Name شون راحت بهشون دسترسی پیدا می کنید.

    شما یک کنترل طراحی کرده اید که داخلش یکسری کنترل فرزند داره، و حالا می خواهید امکان این باشه که چند نمونه از این کنترل مثلا زیر هم ردیف بشن و ...
    برای کنترلی که شما طراحی کرده اید بستر مناسب کنترل هایی مثل FlowLayoutPanel و TableLayoutPanel ئه. البته با Panel و GroupBox هم میشه ولی در Panel و GroupBox برای قرارگیری کنترل ها باید موقعیت افقی عمودی شون رو خودتون تنظیم کنید. ولی چون FlowLayoutPanel ساختار ساده تری داره و تنظیم موقعیت خودکار ئه، معمولا انتخاب راحتی است.
    صرفا در بعضی کاربرد ها که ظاهر پیچیده است، مثلا میخواهید ظاهر ستون بندی بشه و سمت چپ و وسط و بالا و پایین و ... موارد خاصی قرار بگیره، دیگه FlowLayoutPanel امکان تنظیم زیادی نداره و باید بجایش از TableLayoutPanel استفاده کنید که سطر و ستون بندی مجهز داره.

  5. #5

    نقل قول: یوزر کنترل

    بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟

  6. #6

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟
    خیلی ساده، اگر با اندیس کار کنید، کنترل چهارم اندیس 3 داره (اندیس 0 برای کنترل اول) پس با flowLayoutPanel1.Controls[3] به اون کنترل چهارم دسترسی دارید.
    اگر هم با نام کار کنید و Name اون کنترل چهارم رو "c4" قرار داده باشید با flowLayoutPanel1.Controls["c4"] به اون کنترل چهارم دسترسی دارید.
    پس تا اینجا کد چیزی شبیه به این شد که MyUserControl باید نوع کنترل شما باشه، هر اسمی که هست :

    var c = (MyUserControl) flowLayoutPanel1.Controls[3];

    برای اینکه به اون Button داخلش هم دسترسی راحتی داشته باشید در موقع طراحی کنترل تون اون Button رو انتخاب کنید و مشخصه Modifiers رو روی Public قرار بدهید.
    اینطوری فرضا با c.btn_stop به دکمه btn_stop دسترسی دارید.

  7. #7

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    بله این کنترل ها در flowlayoutpanel دارن اضافه میشن و زیر هم قرار میگیرن اینکه هر شی یک نام داره درست ولی خب مثلا امکان داره ۵ تا کنترل همزمان داخل این پنل در حال اجرا باشن و کاربر بخواد فرضا ایتم چهارم رو stop کنه حالا اگه مثلا نام این باتن btn_stop باشه باید چطوری دسترسی پیدا کنیم به کنترل چهارم و بعد باتن stop رو بزنیم؟
    براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
    برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.

  8. #8

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط Mahmoud.Afrad مشاهده تاپیک
    براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
    برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.
    ببینید من از backgroundworker استفاده میکردم زمانی که انتقال فایل انجام میشد!! برنامه اینطوری باید کار کنه زمانی که past رو میزنی یوزر کنترل فراخوانی میشه حالا این یوزر کنترل چند تا کنترل مثل پروگرس بار و تکست باکس و باتن داره!! حالا من میخوام زمانی که روی این باتن کلیک شد عملیات انتقال فایل انجام بشه !! سوالم اینه که backgroundworker رو کجا باید بنویسم ؟ داخل یوزر کنترل؟ یا داخل فرم؟ اگه داخل فرم بنویسم چطوری باید عمل کرد؟ چون رویداد کلیک رو داخل یوزر کنترل تعریف کردم ولی background worker داخل فرم

  9. #9

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    ببینید من از backgroundworker استفاده میکردم زمانی که انتقال فایل انجام میشد!! برنامه اینطوری باید کار کنه زمانی که past رو میزنی یوزر کنترل فراخوانی میشه حالا این یوزر کنترل چند تا کنترل مثل پروگرس بار و تکست باکس و باتن داره!! حالا من میخوام زمانی که روی این باتن کلیک شد عملیات انتقال فایل انجام بشه !! سوالم اینه که backgroundworker رو کجا باید بنویسم ؟ داخل یوزر کنترل؟ یا داخل فرم؟ اگه داخل فرم بنویسم چطوری باید عمل کرد؟ چون رویداد کلیک رو داخل یوزر کنترل تعریف کردم ولی background worker داخل فرم
    در خود رخداد Click دکمه BackgroundWorker جدید بسازید، البته مزیت BackgroundWorker به سادگی قرار دادنش روی فرم ئه، اگر قرار باشه اینطوری BackgroundWorker با کد نویسی ایجاد بشه از کاربرد اصلیش دور میشه و ساختن Thread و Task و ... گزینه های مناسب تری هستند. ساختن BackgroundWorker در کد اینطوریه ولی اگر کسی بپرسه "چرا با BackgroundWorker؟" استدلالی برای دفاع ندارم :


    private void button1_Click(object sender, EventArgs e)
    {
    progressBar1.Visible = true;
    var bw = new BackgroundWorker();
    bw.DoWork += Bw_DoWork;
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
    bw.RunWorkerAsync();
    }

    private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    // Copy finished.
    progressBar1.Visible = false;
    ((BackgroundWorker)sender).Dispose();
    }

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    // Copy files...
    }

  10. #10

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط Mahmoud.Afrad مشاهده تاپیک
    براش رویداد ایجاد کنید که با کلیک اون رویداد فایر بشه.
    برای انتقال اطلاعات به کنترل هایی مثل لیبل و پروگرسبار و ... هم پراپرتی ایجاد کنید.
    نقل قول نوشته شده توسط the king مشاهده تاپیک
    در خود رخداد Click دکمه BackgroundWorker جدید بسازید، البته مزیت BackgroundWorker به سادگی قرار دادنش روی فرم ئه، اگر قرار باشه اینطوری BackgroundWorker با کد نویسی ایجاد بشه از کاربرد اصلیش دور میشه و ساختن Thread و Task و ... گزینه های مناسب تری هستند. ساختن BackgroundWorker در کد اینطوریه ولی اگر کسی بپرسه "چرا با BackgroundWorker؟" استدلالی برای دفاع ندارم :


    private void button1_Click(object sender, EventArgs e)
    {
    progressBar1.Visible = true;
    var bw = new BackgroundWorker();
    bw.DoWork += Bw_DoWork;
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
    bw.RunWorkerAsync();
    }

    private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    // Copy finished.
    progressBar1.Visible = false;
    ((BackgroundWorker)sender).Dispose();
    }

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    // Copy files...
    }
    ممنون
    بعد این بحث pause resume و skip رو توی پروگس بار چطوری باید پیاده کرد؟

  11. #11

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    ممنون
    بعد این بحث pause resume و skip رو توی پروگس بار چطوری باید پیاده کرد؟
    نمیدونم منظورتون از Skip چیه، ولی اگر هدف رد شدن از کپی بعضی فایل ها است، ربطی به خود BackgroundWorker یا ProgressBar نداره.
    می توانید با تغییر مقدار یک متغیر یا دستکاری در یک لیست فایل ها پیاده اش کنید.

    اما اگر میخواهید روال کپی رو با یک کلیک Cancel یا Abort کنید، اولا باید WorkerSupportsCancellation رو true کنید :

    private void button1_Click(object sender, EventArgs e)
    {
    progressBar1.Visible = true;
    var bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += Bw_DoWork;
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
    bw.RunWorkerAsync();
    }

    و بعد هر جا که لازمه Cancel کنید، با ()bw.CancelAsync به BackgroundWorker ئه پیام می دهید که لطفا متوقف شو. این صرفا پیام ئه، خودش کاری انجام نمیده.
    بعد در کد داخل Bw_DoWork هم خودتون باید چک کنید که اگه CancellationPending اش true شده حرف گوش کنه و کپی رو متوقف کنه.
    توقف دست خودتونه و به کدتون بستگی داره، می توانید به درخواست توجه نکنید و روال ادامه پیدا کنه.

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    foreach (var file in files)
    {
    if (((BackgroundWorker)sender).CancellationPending)
    {
    return;
    }
    // Copy file...
    }
    }


    برای Pause و Resume هم می توانید یک فیلد اختصاص بدهید که اگر مقدارش true شد داخل Bw_DoWork تا وقتی true ئه داخل یک حلقه چرت بزنه.
    مثلا با ;System.Threading.Thread.Sleep(100) و موقع Pause مقدار متغیر ئه رو true کنید و موقع Resume مقدارش رو false کنید.


    private bool _pause;

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    foreach (var file in files)
    {
    if (((BackgroundWorker)sender).CancellationPending)
    {
    return;
    }
    while (_pause)
    {
    System.Threading.Thread.Sleep(100);
    }
    // Copy file...
    }
    }

  12. #12

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    نمیدونم منظورتون از Skip چیه، ولی اگر هدف رد شدن از کپی بعضی فایل ها است، ربطی به خود BackgroundWorker یا ProgressBar نداره.
    می توانید با تغییر مقدار یک متغیر یا دستکاری در یک لیست فایل ها پیاده اش کنید.

    اما اگر میخواهید روال کپی رو با یک کلیک Cancel یا Abort کنید، اولا باید WorkerSupportsCancellation رو true کنید :

    private void button1_Click(object sender, EventArgs e)
    {
    progressBar1.Visible = true;
    var bw = new BackgroundWorker();
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += Bw_DoWork;
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
    bw.RunWorkerAsync();
    }

    و بعد هر جا که لازمه Cancel کنید، با ()bw.CancelAsync به BackgroundWorker ئه پیام می دهید که لطفا متوقف شو. این صرفا پیام ئه، خودش کاری انجام نمیده.
    بعد در کد داخل Bw_DoWork هم خودتون باید چک کنید که اگه CancellationPending اش true شده حرف گوش کنه و کپی رو متوقف کنه.
    توقف دست خودتونه و به کدتون بستگی داره، می توانید به درخواست توجه نکنید و روال ادامه پیدا کنه.

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    foreach (var file in files)
    {
    if (((BackgroundWorker)sender).CancellationPending)
    {
    return;
    }
    // Copy file...
    }
    }


    برای Pause و Resume هم می توانید یک فیلد اختصاص بدهید که اگر مقدارش true شد داخل Bw_DoWork تا وقتی true ئه داخل یک حلقه چرت بزنه.
    مثلا با ;System.Threading.Thread.Sleep(100) و موقع Pause مقدار متغیر ئه رو true کنید و موقع Resume مقدارش رو false کنید.


    private bool _pause;

    private void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
    foreach (var file in files)
    {
    if (((BackgroundWorker)sender).CancellationPending)
    {
    return;
    }
    while (_pause)
    {
    System.Threading.Thread.Sleep(100);
    }
    // Copy file...
    }
    }
    اره منظورم دقیقا رد شدن از کپی بعضی فایل ها بود فقط برای pause داخل رویداد کلیک pause بعد از ایکنه اون متغیر رو true کردیم چی باید بگیم؟ منظورم اینه چطوری do work رو صدا بزنیم؟

  13. #13

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    اره منظورم دقیقا رد شدن از کپی بعضی فایل ها بود فقط برای pause داخل رویداد کلیک pause بعد از ایکنه اون متغیر رو true کردیم چی باید بگیم؟ منظورم اینه چطوری do work رو صدا بزنیم؟
    نه، دیگه DoWork رو مجددا صدا نمی زنید، قبلا صدا زده بودنیش که کپی شروع شده. همون true کردن متغیر pause_ به تنهایی باعث توقف روالی میشه که DoWork داره انجام میده. مادامی که pause_ ئه true هست روال متوقف میمونه. هر وقت به قصد resume متغیر ئه رو false کنید از همونجا که متوقف شده بود ادامه میده و باز نیازی به فراخوانی DoWork نیست.

  14. #14

    نقل قول: یوزر کنترل

    کدی که گفته بودین رو نوشتم اما اتفاقی رخ نمیده
    آخرین ویرایش به وسیله qasemf : شنبه 06 دی 1399 در 14:51 عصر

  15. #15

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    نه، دیگه DoWork رو مجددا صدا نمی زنید، قبلا صدا زده بودنیش که کپی شروع شده. همون true کردن متغیر pause_ به تنهایی باعث توقف روالی میشه که DoWork داره انجام میده. مادامی که pause_ ئه true هست روال متوقف میمونه. هر وقت به قصد resume متغیر ئه رو false کنید از همونجا که متوقف شده بود ادامه میده و باز نیازی به فراخوانی DoWork نیست.

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {

    var dest = Path.GetFullPath(txt_usercontrol.Text );
    var list = new List<KeyValuePair<string, string>>();
    foreach (var item in replacementList)
    {
    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);
    }

    }
    }



    ببینید این do work هست اون کدی که شما فرمودین رو هر جایی که مینویسم اتفاقی رخ نمیده مشکل کجاست به نظر شما؟

    private void btn_pause_Click(object sender, EventArgs e)
    {
    if (btn_pause.Text == "pause")
    {
    _pause = true;
    btn_pause.Text = "resume";
    }
    else
    {
    _pause = false;
    btn_pause.Text = "pause";
    }

    }

    برام سواله do work چطوری میفهمه متغیر true شده

  16. #16

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {

    var dest = Path.GetFullPath(txt_usercontrol.Text );
    var list = new List<KeyValuePair<string, string>>();
    foreach (var item in replacementList)
    {
    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);
    }

    }
    }



    ببینید این do work هست اون کدی که شما فرمودین رو هر جایی که مینویسم اتفاقی رخ نمیده مشکل کجاست به نظر شما؟

    private void btn_pause_Click(object sender, EventArgs e)
    {
    if (btn_pause.Text == "pause")
    {
    _pause = true;
    btn_pause.Text = "resume";
    }
    else
    {
    _pause = false;
    btn_pause.Text = "pause";
    }

    }

    برام سواله do work چطوری میفهمه متغیر true شده
    آخه شرطش رو از قلم انداخته اید.
    ببینید در مثال من یه while (_pause) بود با یک Sleep(100) داخلش؟ اون رو از قلم انداخته اید.
    داخل حلقه for (var i = 0; i < list.Count; i++) تون و پیش از سایر کد ها اون while (_pause) و Sleep(100) داخلش رو اضافه کنید.

  17. #17

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    آخه شرطش رو از قلم انداخته اید.
    ببینید در مثال من یه while (_pause) بود با یک Sleep(100) داخلش؟ اون رو از قلم انداخته اید.
    داخل حلقه for (var i = 0; i < list.Count; i++) تون و پیش از سایر کد ها اون while (_pause) و Sleep(100) داخلش رو اضافه کنید.
    همون اول شرط رو گذاشتم جواب نداد ولی خب اینظوری حلش کردم

    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;
    }
    }


    البته زمانی که pause زده میشه باید locker.Reset(); و زمان resume هم باید locker.Reset(); رو بنویسیم
    عذر میخوام تا الان اگه شما نبودین مشکلاتم رو نمیتونستم رفع کنم
    برای درگ و دراپ کردن فایل ها چطور میشه عمل کرد مثلا زمانی که انتقال فایل در حال انجام هست چطور میشه یک فایل رو درگ کنیم و بندازیم داخل پروگرس بار؟ یا زمانی که میخوایم تعدادی فایل رو از داخل لیست ویو درگ کنیم و داخل یه فولدر دیگه بندازیم

  18. #18

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    همون اول شرط رو گذاشتم جواب نداد ولی خب اینظوری حلش کردم

    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;
    }
    }


    البته زمانی که pause زده میشه باید locker.Reset(); و زمان resume هم باید locker.Reset(); رو بنویسیم
    عذر میخوام تا الان اگه شما نبودین مشکلاتم رو نمیتونستم رفع کنم
    برای درگ و دراپ کردن فایل ها چطور میشه عمل کرد مثلا زمانی که انتقال فایل در حال انجام هست چطور میشه یک فایل رو درگ کنیم و بندازیم داخل پروگرس بار؟ یا زمانی که میخوایم تعدادی فایل رو از داخل لیست ویو درگ کنیم و داخل یه فولدر دیگه بندازیم
    منطق کدی که نوشته اید رو درک نمی کنم، Sleep رو بدون شرط دارید اعمال می کنید، یعنی برای هر 100 مورد تکرار حلقه Sleep دارید، جمعا ده ثانیه مکث می کنه، با چه هدفی؟

    برای Drag Drop مطالبی مثل اینها رو ببینید :
    سوال: یک نمونه کدی و یا آموزش درباره درگ و داپ کردن
    باز کردن چند فایل به طور همزمان بدون استفاده از OpenFileDialog

  19. #19

    نقل قول: یوزر کنترل

    منم خودم موندم ولی تست کردم تا یک ساعتم تست کردم درست کار میکنه ببینید زمانی که pause رو میزنیم locker رو ریست میکنیم چون مقدار اولیه locker رو true قرار دادیم( locker یک ManualResetEvent هست) بنابراین شرط ما locker هست که وقتی ریست شد میتونیم با فراخوانی()locker.WaitOn شرط رو برقرار کنیم همین که شرط برقرار شد (100)Thread Sleep روال رو متوقف میکنه فقط خودمم موندم این ۱۰۰ واقعا چکار میکنه به قول شما ۱۰ ثانیه بیشتر نباید بشه ولی تا یه ساعتم چک کردم روال متوقف مونده

  20. #20

    نقل قول: یوزر کنترل

    نقل قول نوشته شده توسط qasemf مشاهده تاپیک
    منم خودم موندم ولی تست کردم تا یک ساعتم تست کردم درست کار میکنه ببینید زمانی که pause رو میزنیم locker رو ریست میکنیم چون مقدار اولیه locker رو true قرار دادیم( locker یک ManualResetEvent هست) بنابراین شرط ما locker هست که وقتی ریست شد میتونیم با فراخوانی()locker.WaitOn شرط رو برقرار کنیم همین که شرط برقرار شد (100)Thread Sleep روال رو متوقف میکنه فقط خودمم موندم این ۱۰۰ واقعا چکار میکنه به قول شما ۱۰ ثانیه بیشتر نباید بشه ولی تا یه ساعتم چک کردم روال متوقف مونده
    اون (100)Sleep میگه به مدت 100 میلی ثانیه (یک دهم ثانیه) بخواب و بعد بیدار شو، یعنی DoWork به مدت 100 میلی ثانیه مکث کنه و بعد مجددا کارش رو ادامه بده.
    معمولا در جایی که میخوان یک شرط رو مدام بررسی کنند و نمیخوان این بررسی های مکرر فشار به پردازنده بیاره، بین بررسی ها یک مکث کوتاه ایجاد می کنند تا در اون فاصله (که البته از دید پردازنده زمان زیادیه، میتونه در اون 100 میلی ثانیه میلیارد ها دستور اجرا بشه) کاری به پردازنده نداشته باشه.
    اگر مساله رو با ManualResetEvent حل کرده باشید قاعدتا اون Sleep اضافیه و نیازی به مکث با Sleep نیست.

  21. #21

    نقل قول: یوزر کنترل

    اخه همون اول تست کردم واقعا برام جالبه گاهی وقتها یه چیزایی برام مبهمه اون sleep رو که برداری توقف صورت نمیگیره!!! موندم اون sleep دقیقا چه کاری انجام میده وقتی ManualResetEvent هست ولی واقعا تست کردم و جواب نداد واسه همین چون کارمو راه انداخت گفتم اشکال نداره به هر حال بازم ممنونم

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

  1. سوال: authenticate کردن یوزرها و خواندن یوزر و پسورد از دیتابیس
    نوشته شده توسط manit44 در بخش ASP.NET Web Forms
    پاسخ: 8
    آخرین پست: پنج شنبه 17 بهمن 1392, 13:29 عصر
  2. پاسخ: 3
    آخرین پست: جمعه 06 بهمن 1391, 02:49 صبح
  3. پاسخ: 2
    آخرین پست: جمعه 07 مهر 1391, 18:37 عصر
  4. سوال: قرار گرفتن یوزر جاری ویندوز در لیست یوزر ها
    نوشته شده توسط maxpayn2 در بخش ASP.NET Web Forms
    پاسخ: 3
    آخرین پست: چهارشنبه 24 اسفند 1390, 10:33 صبح
  5. سوال: ایجاد یوزر وپسورد با سطح دسترسی یوزر ها
    نوشته شده توسط saeed741 در بخش Access
    پاسخ: 3
    آخرین پست: یک شنبه 03 مهر 1390, 17:36 عصر

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

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