PDA

View Full Version : مبتدی: چک کردن اتصال اینترنت در تایمر



cmsdqq2
شنبه 05 دی 1394, 23:54 عصر
سلام

اگر فرضاً بخوایم هر 40 ثانیه، اتصال به اینترنت بررسی باشه، باید از چه طریقی عمل کرد؟

hadi vafaii
یک شنبه 06 دی 1394, 01:35 صبح
یه راهی که الان به ذهنم رسید اینه که دوتا تایمر بذار و هر کدوم که به 40 رسید چک کنه و تایمر دومی شروع به کار کنه و اولی از کار بیفته و دومی به 40 رسید چک کنه و دوباره اولی شروع به کار کنه و دومی از کار بیفته

cmsdqq2
یک شنبه 06 دی 1394, 05:40 صبح
هر موقع که به چهل رسید، دوباره همون تایمر از صفر شروع کنه چطوره؟

محمد رضا فاتحی
یک شنبه 06 دی 1394, 07:49 صبح
سلام...چکاریه...اگه می خواین از تایمر استفاده کنید می تونید تاخیرش رو برابر 40000 قرار بدید و تابع چک اینترنت رو داخل تایمر بزارید...
یکار دیگه هم استفاده از حلقه بی نهایته که داخل یه ترد توی پشت زمینه در حال اجرا باشه

cmsdqq2
یک شنبه 06 دی 1394, 13:06 عصر
"
یکار دیگه هم استفاده از حلقه بی نهایته که داخل یه ترد توی پشت زمینه در حال اجرا باشه"

بنده متوجه این بخش نشدم

cmsdqq2
یک شنبه 06 دی 1394, 13:39 عصر
منظورتون حلقه for هست؟

محمد رضا فاتحی
یک شنبه 06 دی 1394, 13:45 عصر
راهکار ساده...
تو فرم مورد نظرتون یه کنترل BackgroundWorker قرار بدید و تو رویداد اصلیش(DoWork) این کد رو بنویسید

while (true)
{
//CheckConnectToInternet;
System.Threading.Thread.Sleep(40000);
}


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

cmsdqq2
یک شنبه 06 دی 1394, 14:32 عصر
سپاس از شما

بنده الان از کد زیر استفاده کردم. هر 30 ثانیه اتصال اینترنت رو بررسی میکنه، اگر اتصال وصل باشه تا زمانیکه اتصال موجوده تابع saveondb رو اجرا میکنه!!! راهکاری دارین؟





public bool CheckForInternetConnection()
{
string host = "google.com";
bool result = false;
Ping p = new Ping();
try
{
PingReply reply = p.Send(host, 5000);
if (reply.Status == IPStatus.Success)
{
saveondb();
return true;


}
}
catch { }
return result;
}


private void timer2_Tick(object sender, EventArgs e)
{
CheckForInternetConnection();
}

محمد رضا فاتحی
یک شنبه 06 دی 1394, 15:51 عصر
شما تو تابع چک کردن اینترنت savedb رو قرار دادید و اگه هر 30 ثانیه چک می کنه مطمئنا هر 30 ثانیه یک بارهم تابع فراخوانی میشه...
نمی دونم دقیقا برنامه شما قراره چکاری بکنه ولی اگه ذخیره اطلاعات روی سروری چیزی مد نظرتونه که به اینترنت بستگی داره که فقط کافیه قبل از ثبت اطلاعات اتصال بررسی بشه که احتیاجی به هر 30 ثانیه نیست
اگه نه کار دیگه ای انجام می ده بیشتر توضیح بدید شاید بشه بهتر راهنمایی کرد...

cmsdqq2
یک شنبه 06 دی 1394, 18:35 عصر
ما دو دسته اطلاعات داریم، یک دسته باید در سرور ذخیره بشن (دیتابیس آنلاین) یک دسته دیگه در دیتابیس لوکال.

اینجا با دیتابیس لوکال که کاری نداریم، درسته؟

حالا من میخوام بگم، وقتی فرم لود میشه اگر اتصال به اینترنت بود، اطلاعات رو در دیتابیس آنلاین ذخیره کن، اگر اینترنت نبود، هر 40 ثانیه بررسی کن که اتصال به اینترنت هست یا نه و هر موقع اتصال بود، اطلاعات رو در همون لحظه ذخیره کن.

cmsdqq2
یک شنبه 06 دی 1394, 21:24 عصر
دوستان پیشنهادی ندارین؟

محمد رضا فاتحی
دوشنبه 07 دی 1394, 07:53 صبح
دوست عزیز...برای اتصال توی دیتابیس لوکال که احتیاجی به بررسی اینترنت ندارید...برای بحث ثبت توی دیتابیس هاست هم اگه اطلاعات خیلی مهم نیست که آنی وارد بشه می تونید یه جدول موقت توی دیتابیس لوکال در نظر بگیرید و اطلاعات رو پس از ثبت توی جدول موقت در یه بازه منطقی با استفاده از همون بکگراند ورکر و توابع مورد نیاز اطلاعات رو روی هاست قرار بدید

cmsdqq2
دوشنبه 07 دی 1394, 12:02 عصر
نباید در جدول موقت قرار داده بشه. بنده الان با این کد هیچ مشکلی ندارم جز اینکه اگر اتصال به اینترنت فعال باشه، به مقدار تایمر، تابع رو اجرا میکنه. شما دستوری، کدی، راهکاری ندارین؟ اعمال شرطی ...؟

zayens
دوشنبه 07 دی 1394, 15:13 عصر
سپاس از شما

بنده الان از کد زیر استفاده کردم. هر 30 ثانیه اتصال اینترنت رو بررسی میکنه، اگر اتصال وصل باشه تا زمانیکه اتصال موجوده تابع saveondb رو اجرا میکنه!!! راهکاری دارین؟





public bool CheckForInternetConnection()
{
string host = "google.com";
bool result = false;
Ping p = new Ping();
try
{
PingReply reply = p.Send(host, 5000);
if (reply.Status == IPStatus.Success)
{
saveondb();
return true;


}
}
catch { }
return result;
}


private void timer2_Tick(object sender, EventArgs e)
{
CheckForInternetConnection();
}



ازین کد استفاده کن:



System.Net.WebClient

public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
{
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
}
catch
{
return false;
}
}



private void timer2_Tick(object sender, EventArgs e)
{
if (CheckForInternetConnection())
{
saveondb();
}
}

cmsdqq2
دوشنبه 07 دی 1394, 15:38 عصر
ممنون از اینکه پاسخ دادین اما مشکل همچنان پابرجاست.

در هر دو حالت، بررسی میشه که اگر اتصال به اینترنت برقرار شد، تابع saveondb رو اجرا کنه. اما مسئله اینجاست که این دستور در یک تایمر هست. یعنی اگر اینترنت وجود نداشته باشه، اندازه تایمر منتظر میمونه تا اتصال برقرار بشه و وقتی برقرار شد به اندازه تایمر تابع رو اجرا میکنه!

من میخوام اگر اتصال برقرار شد، تابع فقط یکبار اجرا بشه

محمد رضا فاتحی
دوشنبه 07 دی 1394, 15:46 عصر
کلا باید یکبار اجرا بشه؟

cmsdqq2
دوشنبه 07 دی 1394, 15:51 عصر
کلا باید یکبار اجرا بشه؟

با هر بار لود شدن فرم:

اتصال بررسی بشه

1-1 اگر اتصال برقرار بود: فقط یکبار اجرا بشه

1-2 اگر اتصال نبود: هر چهل ثانیه یکبار، دسترسی به اینترنت رو بررسی کنه تا زمانیکه دسترسی موجود باشه. وقتی دسترسی موجود بود، فقط یکبار تابع saveondb اجرا بشه

محمد رضا فاتحی
دوشنبه 07 دی 1394, 15:58 عصر
خوب ابنکه کاری نداره... می تونید بعد از اجرا شدن تابع ذخیره سازی اطلاعات تایمر رو غیر فعال کنید...این کار باعث می شه که دیگه رویداد تیک تایمر اجرا نشه

zayens
دوشنبه 07 دی 1394, 16:02 عصر
بفرمایید
bool IsRunOnce=false;
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
{
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
}
catch
{
return false;
}
}



private void timer2_Tick(object sender, EventArgs e)
{
if (CheckForInternetConnection() && !IsRunOnce)
{
saveondb();
IsRunOnce=true;
}
}

cmsdqq2
دوشنبه 07 دی 1394, 16:11 عصر
متاسفانه هنوز مشکل موجوده. هر چهل ثانیه که بگذره، اگر اینترنت باشه، تابع رو اجرا میکنه

محمد رضا فاتحی
دوشنبه 07 دی 1394, 16:14 عصر
تکه کد مورد استفادتون رو کامل میزارید؟

cmsdqq2
دوشنبه 07 دی 1394, 16:18 عصر
چک کردم، تمام موارد درسته فقط مشکل از همین کده. کد من کدی هست که قبلا معرفی کردن:




bool IsRunOnce = false;
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
{
using (var stream = client.OpenRead("http://www.google.com"))
{
return true;
}
}
}
catch
{
return false;
}
}






private void timer2_Tick(object sender, EventArgs e)
{
if (CheckForInternetConnection() && !IsRunOnce)
{
saveondb();
IsRunOnce = true;

}
}






فقط یک نکته: Interval تایمر = 40000 و Enabled هم True هست

cmsdqq2
دوشنبه 07 دی 1394, 22:40 عصر
سپاس از همه.

مشکل با کد فرستاده شده حل شد.

یک سوال دیگه، شما در مورد http://barnamenevis.org/showthread.php?515212-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-Setting

این مورد هم نظری دارین؟

zayens
چهارشنبه 09 دی 1394, 12:55 عصر
داداش این همه تایپ نمودیم از دکمه تشکر پایین پستها استفاده بنما