PDA

View Full Version : سئوال درباره مشکل Thread



SajjadKhati
سه شنبه 19 بهمن 1395, 17:11 عصر
سلام مجدد
چرا توی این کد وقتی در نخ جدید ، تایمر رو فراخونی میکنیم ، کار نمیکنه؟ هر دو نوع 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.ToStri ng(), "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.ToStri ng(), "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.ToStri ng(), "in function");
}

private void timerSuspendThread_Tick(object sender, EventArgs e)
{
MessageBox.Show(suspendThread_2.ThreadState.ToStri ng(), "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) مشکل داره .