PDA

View Full Version : سوال: اجرای دو پروسس بار به وسیله ترید



marya101000
شنبه 26 آذر 1390, 21:09 عصر
با سلام خدمت دوستان عزیزم میخوام بدونم چه جور میشه به وسیله تردها دوتا پروسس بار را با هماجرا کنیم که Error ندهد کد برنامه من این می باشد اشکال کجاست؟؟ با تشکر

using System;
//thread
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication19
{
public partial class Form1 : Form
{
int k = 0;
void main()
{
Thread t = new Thread(child);
t.Start();
progressBar1.Value = k;
}
void child()
{

progressBar2.Value = k;
}

public Form1()
{
InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}

private void Form1_Load(object sender, EventArgs e)
{

}

public void progressBar1_Click(object sender, EventArgs e)
{

}

public void progressBar2_Click(object sender, EventArgs e)
{

}

private void timer1_Tick(object sender, EventArgs e)
{

k++;
if (k == 100)
timer1.Enabled = false;
textBox1.Text = Convert.ToString(k);
main();
}

private void button2_Click(object sender, EventArgs e)
{


}
}
}

reza_mostafavi63
شنبه 26 آذر 1390, 21:32 عصر
//
private void Form1_Load(object sender, EventArgs e)
{
Thread t1 = new Thread(p1);
t1.IsBackground = true;
Thread t2 = new Thread(p2);
t2.IsBackground = true;

t1.Start();
t2.Start();
}
void p1()
{
Thread.Sleep(100);
progressBar1.Value += 1;
if (progressBar1.Value < progressBar1.Maximum)
p1();
}
void p2()
{
Thread.Sleep(200);
progressBar2.Value += 1;
if (progressBar2.Value < progressBar2.Maximum)
p2();
}

marya101000
شنبه 26 آذر 1390, 23:30 عصر
مرسی ولی باز error میده متن error :
Cross-thread operation not valid: Control 'progressBar2' accessed from a thread other than the thread it was created on.

Legend M.A.R
شنبه 26 آذر 1390, 23:38 عصر
دستور بالا رو به صورت زیر اصلاح کن (دلیل: مالک اشیاء مورد نظر یک thread دیگر یا همون پروسس اصلی می باشد که امکان دسترسی (مستقیم به) آن از طریق thread های خارجی ممکن نیست



private Boolean p_breakProccess_1 = false;
private delegate void fuctionWithoutParameter();

void proccess_1()
{
fuctionWithoutParameter g_invoke = new fuctionWithoutParameter(changeValueProgress1);
while (!p_breakProccess_1)
{
System.Threading.Thread.Sleep(100);
this.Invoke(g_invoke);
}//end while
}

void changeValueProgress1()
{
progressBar1.Value += 1;
if (progressBar1.Value < progressBar1.Maximum) p_breakProccess_1 = true;
}


منظور از this کلاسی از که از Control ارث بری دارد مثلا Form یا Panel و ... چون تنها این کلاس ها هستند که تابع invoke دارند

reza_mostafavi63
یک شنبه 27 آذر 1390, 00:27 صبح
مرسی ولی باز error میده متن error :
Cross-thread operation not valid: Control 'progressBar2' accessed from a thread other than the thread it was created on.


دستور بالا رو به صورت زیر اصلاح کن (دلیل: مالک اشیاء مورد نظر یک thread دیگر یا همون پروسس اصلی می باشد که امکان دسترسی (مستقیم به) آن از طریق thread های خارجی ممکن نیست

براي رفع اين مشكل برنامه قبلي رو كه داده بودم رو اينطوري تغيير بده :


//
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
//
//
Thread t1 = new Thread(p1);
t1.IsBackground = true;
Thread t2 = new Thread(p2);
t2.IsBackground = true;

t1.Start();
t2.Start();
}

mmd2009
یک شنبه 27 آذر 1390, 03:55 صبح
براي رفع اين مشكل برنامه قبلي رو كه داده بودم رو اينطوري تغيير بده :


//
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
//
//
Thread t1 = new Thread(p1);
t1.IsBackground = true;
Thread t2 = new Thread(p2);
t2.IsBackground = true;

t1.Start();
t2.Start();
}


با سلام

این روش مناسب نیست. دلیلش رو هم قبلا گفتم و تو خود اینترنت و حتی msdn جستجو کنید میبینید که این روش مناسب نیست.

روش مناسب استفاده در چنین شرایطی رو شخصا بارها تو انجمن گفتم و کافیه جستجو کنید

موفق باشید.

marya101000
یک شنبه 27 آذر 1390, 18:01 عصر
با تشکر فراوان از شما بله درست شد
مرسی ممنون

reza_mostafavi63
یک شنبه 27 آذر 1390, 18:34 عصر
با سلام

این روش مناسب نیست. دلیلش رو هم قبلا گفتم و تو خود اینترنت و حتی msdn جستجو کنید میبینید که این روش مناسب نیست.

روش مناسب استفاده در چنین شرایطی رو شخصا بارها تو انجمن گفتم و کافیه جستجو کنید

موفق باشید.

منم فكر ميكنم درست نباشه ..... لطفا اگه بره كنار اومدن با اين مشكل قبلا تاپيكي در اين سايت وجود داره ، لينك اون رو بزارين بي زحمت ... با تشكر .