PDA

View Full Version : سوال: استفاده از تایمر در thread



sinayas
یک شنبه 25 اسفند 1392, 14:45 عصر
سلام به همه دوستان
من قصد دارم که تو برنامه هر یک دقیقه یک بار بررسی اینترنت چک بشه .
از تایمر استفاده کردم ولی کمی برنامه سنگین شد .
قصد استفاده از تایمر رو داخل یک thread دیگه داشتم که هر کاری کردم موفق نشدم .

چند تا سوال و کمک

برای بررسی برقراری اتصال اینترنت بهترین راه چیه ؟
چطوری از تایمر داخل یک ترید دیگه استفاده بکنم .

ممنون از همه

Davidd
یک شنبه 25 اسفند 1392, 16:55 عصر
داخل thread نيازي به تايمر نيست. داخل ترد يك حلقه بنويس كه به صورت مداوم اجرا بشه و اتصال به اينترنت چك بشه. انتهاي حلقه هم از متد sleep استفاده كن تا نخ اون مدت زماني كه ميخاي معلق بشه در اين مورد Thread.sleep(60000) كه باعث ميشه هر بار كه حلقه اجرا شد يك دقيقه نخ معلق بشه.

sinayas
یک شنبه 25 اسفند 1392, 18:49 عصر
ممنون از راهنمایی شما .
من این کار رو انجام دادم . مشکل اینجاست که داخل این ترد اینترنت چک میشه و متن یک لیبل باید تغییر بکنه .
به قسمت تغییر متن که میرسه از برنامه اشکال میگیره و میگه که این لیبل در ترد دیگه ای ایجاد شده
متن پیام
Cross-thread operation not valid: Control 'lblInternetCheck' accessed from a thread other than the thread it was created on.
ممنون میشم کمک کنید .راستش تا بحال با ترد ها کار نکردم

sohil_ww
یک شنبه 25 اسفند 1392, 19:57 عصر
void change_textbox() {
if(this.InvokeRequired)
{
this.Invoke(new MethodInvoker(change_textbox));
}
else
{
for(int i=0;i<500;i++)
{
textBox1.Text = i.ToString();


}

}
}
private void Form1_Load(object sender, EventArgs e)
{
Thread obj = new Thread(change_textbox);
obj.Start();
}

اگه متوجه نشدی در خدمتم

sinayas
یک شنبه 25 اسفند 1392, 21:15 عصر
ممنون از کمک شما
من از این کد به این صورت استفاده کردم

private void InternetCheck() {




if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(InternetCheck));
}
else
{
for (int i=0;i==10000 ;i++ )
{
if (IsConnectedToInternet() != true)
{
lblInternetCheck.Text = "اینترنت قطع است";
lblInternetCheck.ForeColor = Color.Red;
picbInternetCheck.Image = Resources.Network_1_Delete;
}
else
{
lblInternetCheck.Text = "اینترنت وصل است";
lblInternetCheck.ForeColor = Color.Green;
picbInternetCheck.Image = Resources.Network_1_Check;
}


System.Threading.Thread.Sleep(30000);
}



}





}

ولی وقتی برنامه اجرا میشه و متد
Thread tt = new Thread(InternetCheck);
tt.Start();
هیچ اتفاقی نمیفته
و تغییرات اعمال نمیشه

Davidd
دوشنبه 26 اسفند 1392, 07:43 صبح
for (int i=0;i==10000 ;i++ )


اين حلقه كه اصلا اجرا نميشه چون شرط ورود به حلقه يعني , i==10000 هميشه false هست و وارد حلقه نميشه!

sinayas
دوشنبه 26 اسفند 1392, 19:09 عصر
فکر نمیکنم اشکال از حلقه باشه
در هر صورت ممنون میشم اگه بیشتر کمک کنید

sinayas
پنج شنبه 29 اسفند 1392, 00:05 صبح
دوستان ممنون میشم اگه بیشتر کمک کنید

Mousavmousab
پنج شنبه 29 اسفند 1392, 01:07 صبح
به جای == بنویس> احتمالاٌ مشکلتون حل میشه

sinayas
پنج شنبه 29 اسفند 1392, 10:58 صبح
این کار رو هم کردم ولی مشکل حل نشد .
وقتی برنامه شروع میشه ترد رو استارت میکنه و تا آخرین عدد حلقه رو تکرار میکنه و بعد بقیه کارها ادامه پیدا میکنه .
دقیقا طوری رفتار میکنه که ترد دیگه ای نیست و در خود ترد اصلی برنامه اجرا شده .

Mousavmousab
پنج شنبه 29 اسفند 1392, 21:17 عصر
دوست عزیز همیشه سعی نکن که فقط کارتو راه بندازی سعی کن بهترین حالا نباشه حد اقل از روش تقریباٌ اصولی تبعیت کنی

شاید کار شما با تایمر حل بشه ولی درست نیست با تایمر این کار را انجام بدی

شما باید Asyn کد بزنی.
برو Asynch Programming را بررسی کن. بعید بدونم که برای برای این کار بری Asynch را باد بگیری. ولی من امید دارم که این باعث بشه بری دنبالش

93تون مبارک

plus
جمعه 01 فروردین 1393, 00:48 صبح
شما از یه طرف اومدی از Thread استفاده کردی و از طرف دیگه برای جلوگیری از مشکل Cross Thread کل کد رو با شرط this.InvokeRequired توی Thread مربوط به UI اجرا میکنی و این باعث میشه که کد مربوط به بررسی ارتباط در Thread ساخته شده اجرا نشه.فقط کدی که مربوط به ارتباط با UI (تغییر متن کنترل ها و ...) هست رو باید با Invoke در Thread UI اجرا کنید نه همه کد رو:

private void InternetCheck()
{
for (int i=0;i < 10000 ;i++ )
{
bool connected = IsConnectedToInternet();
this.Invoke(new MethodInvoker(SetStateControls), connected);
Thread.Sleep(3000);
}
}

private void SetStateControls(bool connected)
{
if (connected)
{
lblInternetCheck.Text = "اینترنت قطع است";
lblInternetCheck.ForeColor = Color.Red;
picbInternetCheck.Image = Resources.Network_1_Delete;
}
else
{
lblInternetCheck.Text = "اینترنت وصل است";
lblInternetCheck.ForeColor = Color.Green;
picbInternetCheck.Image = Resources.Network_1_Check;
}
}

tooraj_azizi_1035
شنبه 02 فروردین 1393, 20:44 عصر
سلام
از کلاس تایمر استفاده کنید:

using System.Threading;




class TimerExample
{


static void Main()
{



TimerCallback timerDelegate =
new TimerCallback(CheckInternetConnection);

Timer stateTimer = new Timer(timerDelegate, null, TimeSpan.FromMilliseconds(-1), TimeSpan.FromMinutes(1));

}


public void CheckInternetConnection(Object stateInfo)
{

//بررسی اینترنت

});

}

}



یادت باشه که داخل متد CheckInternetConnection اگه خواستی به کنترل های UI دسترسی داشته باشی از متد Invoke استفاده کن.