SajjadKhati
کاربر فعال <A href="http://forum.majidonline.com/f
سلام مجدد
استاد علی ، چرا توی این کد وقتی در نخ جدید ، تایمر رو فراخونی میکنیم ، کار نمیکنه؟ هر دو نوع overload متد SuspendThread3 رو تست کردم با دو نوع فراخونی متفاوت تایمر، ولی نشد :
ولی وقتی در خط سوم متد SuspendThread3 ، کد MessageBox.Show رو از کامنت در میارم ، تایمر هم اجرا میشه. چرا و مشکلش چیه ؟؟!!!
دوم اینکه چرا در یک نخ مجزا و جدید (مثلا همین SuspendThread3 که بدون آرگومان هست) ، اگه یه شی ای بدیم که به کنترل Form1 مربوط میشه (مثلا this یا مثلا this.Handel و از این جور چیزا) ، ارور میده که از یک نخ دیگه دارین به نخی که کنترل Form1 رو فراخونی کردین ، دسترسی پیدا میکنین و یه همچین اروری (عکس ارور رو پیوست کردم) . یعنی توی این متد اگه فراخونی شه ، ارور میده: چرا؟ :
ولی اگه با استفاده از دلیگیت ParameterizedThreadStart ، در ورودی اون متد (نخ) ، شی رو بصورت object بدیم ، مشکلی وجود نداره
و اینکه کلا با چه شی هایی دقیقا مشکل داره؟ من فقط دیدم با شی Form1 (یعنی this) و شی Intptr (یعنی this.Handel) مشکل داره .
استاد علی ، چرا توی این کد وقتی در نخ جدید ، تایمر رو فراخونی میکنیم ، کار نمیکنه؟ هر دو نوع overload متد SuspendThread3 رو تست کردم با دو نوع فراخونی متفاوت تایمر، ولی نشد :
کد:
public partial class Form1 : Form
{
Thread suspendThread_2;
public Form1()
{
InitializeComponent();
threadDelegate2 = new ParameterizedThreadStart(SuspendThread3);
}
public void SuspendThread3()
{
MessageBox.Show("1");
timerSuspendThread.Enabled = true;
//MessageBox.Show(suspendThread_2.ThreadState.ToString(), "in thread");
suspendThread_2.Suspend();
MessageBox.Show("2");
suspendThread_2.Suspend();
MessageBox.Show("3");
suspendThread_2.Suspend();
MessageBox.Show("4");
}
public void SuspendThread3(object controlObj)
{
MessageBox.Show("1");
((System.Windows.Forms.Timer)controlObj).Enabled = true;
//MessageBox.Show(suspendThread_2.ThreadState.ToString(), "in thread");
suspendThread_2.Suspend();
MessageBox.Show("2");
suspendThread_2.Suspend();
MessageBox.Show("3");
suspendThread_2.Suspend();
MessageBox.Show("4");
}
private void btnThread3Timer_Suspend_Click(object sender, EventArgs e)
{
suspendThread_2 = new Thread(threadDelegate2);
suspendThread_2.Start(timerSuspendThread);
MessageBox.Show(suspendThread_2.ThreadState.ToString(), "in function");
}
private void timerSuspendThread_Tick(object sender, EventArgs e)
{
MessageBox.Show(suspendThread_2.ThreadState.ToString(), "in timer");
if (suspendThread_2.ThreadState != System.Threading.ThreadState.Stopped)
{
suspendThread_2.Resume();
}
}
}
ولی وقتی در خط سوم متد SuspendThread3 ، کد MessageBox.Show رو از کامنت در میارم ، تایمر هم اجرا میشه. چرا و مشکلش چیه ؟؟!!!
دوم اینکه چرا در یک نخ مجزا و جدید (مثلا همین SuspendThread3 که بدون آرگومان هست) ، اگه یه شی ای بدیم که به کنترل Form1 مربوط میشه (مثلا this یا مثلا this.Handel و از این جور چیزا) ، ارور میده که از یک نخ دیگه دارین به نخی که کنترل Form1 رو فراخونی کردین ، دسترسی پیدا میکنین و یه همچین اروری (عکس ارور رو پیوست کردم) . یعنی توی این متد اگه فراخونی شه ، ارور میده: چرا؟ :
کد:
public void SuspendThread3(object controlObj)
{
MessageBox.Show("1");
((System.Windows.Forms.Timer)controlObj).Enabled = true;
MessageBox.Show(owner: this, text: suspendThread_2.ThreadState.ToString(), caption: "in thread");
suspendThread_2.Suspend();
}
ولی اگه با استفاده از دلیگیت ParameterizedThreadStart ، در ورودی اون متد (نخ) ، شی رو بصورت object بدیم ، مشکلی وجود نداره
و اینکه کلا با چه شی هایی دقیقا مشکل داره؟ من فقط دیدم با شی Form1 (یعنی this) و شی Intptr (یعنی this.Handel) مشکل داره .