نمایش نتایج 1 تا 29 از 29

نام تاپیک: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

  1. #1
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    Question مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام وقت همه عزیزان بخیر
    من برنامه ای دارم که دارای 2 تا دیتابیس هس لوکال و کلاد یا همون ابری یا ساده تر اینکه روی هاست هست و دسترسی به اون طبعا ملزم به وجود اینترنت هست برای سیستم اصلی.
    نکته اینه که برنامه و کاربر دونستن اینکه اتصال به اینترنت برقرار هست یا نه در زمان کار با برنامه خیلی حیاتی هست ولی نه به این معنی که اگه نت قطع بود کاربر با برنامه کار نکنه بلکه با دیتابیس لوکال میتونه کاراشو انجام بده مثل گزارش گیری محلی و ...
    برنامه بطور همزمان میتونه چندین فرم باز رو داشته باشه و هر ویندو کار مختلفی رو انجام بده
    حالا داستان اینجاست که ما یه ایکن جهت مشخص کردن دسترسی یا عدم دسترسی به نت رو هم رو همه فرمها داریم و میخوایم وقتی به هر دلیلی اینترنت قطع شد ( نحوه چک کردن اتصال رو بلدم و نوشتم و در اکتیو فرم قرار دادم ولی فقط فرم جاری که اکتیو هست - و فقط در لحظه اکتیو شدن چک میکنه و نشون میده) نه فقط فرم جاری یا اکتیو بلکه همه فرمها مطلع بشن و ایکن قطع بودن نت رو نشون بدن و تو ایکن سیستم ترای و فرم جاری با یه تولتیپ به کاربر اطلاع رسانی بشه.
    حالا چه باید کارد؟؟؟
    ممنون از دوستانی که راهنمایی میکنن
    ضمنا شاید من خیلی حرفه ای نباشم پس ممنون میشم توضیح کامل بفرمایید ترجیحا با مثال یا لینکی که مثالی زده شده باشه شاید بدرد بقیه دوستان هم جایی بخوره
    سپاس

  2. #2
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    34
    پست
    138

    Lightbulb نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام دوست گرامی ،

    البته شما که همچین نرم افزاری طراحی میکنین حتما حرفه ای هستین نه مبتدی

    /// <summary>
    /// Author : Shayan Firoozi 2020 Bandar Abbas - Iran
    /// Phone : +98(936)517-5800
    /// Email : Shayan.Firoozi@Gmail.Com
    /// </summary>
    ///


    public static class cNetChecker
    {


    private static System.Timers.Timer myTimer;
    private static bool _is_timer_init = false;


    public static void Init_Timer(int CheckPeriod_In_Second)
    {
    if (_is_timer_init == true)
    {
    return;
    }




    try
    {


    myTimer = new System.Timers.Timer(CheckPeriod_In_Second * 1000);
    myTimer.Elapsed += new ElapsedEventHandler(Do_All_Jobs);
    myTimer.Enabled = true;
    myTimer.AutoReset = true;
    myTimer.Start();


    _is_timer_init = true;
    }
    catch
    {
    _is_timer_init = false;
    }


    }


    private static bool Check_The_Google()
    {
    try
    {
    using (var client = new WebClient())
    using (client.OpenRead("http://google.com/generate_204"))
    return true;
    }
    catch
    {
    return false;
    }
    }




    private static void Do_All_Jobs(object sender, ElapsedEventArgs e)
    {
    if(Check_The_Google() == true)
    {
    _Inform_All_Forms(true);
    }
    else
    {
    _Inform_All_Forms(false);
    }
    }






    private static void _Inform_All_Forms(bool IsInternetConnect)
    {
    foreach (Form OpenForm in Application.OpenForms)
    {
    if (IsInternetConnect == true) SafeSetFormText(OpenForm,"Available");
    if (IsInternetConnect == false) SafeSetFormText(OpenForm, "Not Available");
    }
    }


    private static void SafeSetFormText(Form objForm, string _text)
    {


    lock (objForm)
    {
    if (objForm.InvokeRequired)
    {
    objForm.Invoke(new MethodInvoker(
    delegate ()
    {
    objForm.Text = _text;


    }));
    }
    else
    {
    objForm.Text = _text;
    }
    }
    }


    }


    نحوه کار به این شکل هستش که ما یه کلاس استاتیک کاملا مستقل طراحی میکنیم و هنگام اجرای نرم افزار اصلی (تابع main) اونو راه اندازی میکنیم :


    cNetChecker.Init_Timer(5);


    ** توجه کنین که این کار رو فقط و فقط یک بار انجام میدیم(منظور راه اندازی کلاس هستش)

    خودش بر اساس پریودی که ما مشخص کریم اینترنت رو چک میکنه و اگر در دسترس بودن اونو به همه فرم ها اعلام میکنه ( البته بنده به علت کمبود وقت فقط تیتر فرم ها رو هدف گرفتم !!)

    در خصوص تابع SafeSetFormText باید عرض کنم ضروری هستش چون شما از یک ترد دیگه به ترد های دیگه دسترسی پیدا میکنین اگر از این روش نرین حتما خطای CrossThread رو میگیرن

  3. #3
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام جناب فیروزی عزیز مرسی بابت پاسختون و سپاس از کدی که نوشتید
    راستش این راه شما تقریبا به فکر ماهم رسید ولی 2 تا مورد داره :
    یکی اینکه ما در لحظه نمیتونیم چک کنیم و به هر حال یه دیلیی بابت تایمر داریم مگه اینکه زمان اسکن تایمر رو خیلی کم کنیم که سرعت چک کردن بره بالا حالا مشکلی که پیش میاد اینکه سربار خیلی زیادی به سیتستم میاد و سی پی یو درگیر میشه و حالا اگه این تایمر رو تو یه ترد دیگه بزاریم باز هم این داستان کمو بیش هست اما فکری که خودم کردم ولی هنو کدی ننوشتم چون تا حالا انجام ندادم و البته گفتم شاید راه حل های بهتری هم باش که خلاقانه تر باشه ( البته با پاسخ شما هنوزم منتظرم!!) این که یه ایونت هندلر گلوبال یا یه همچین چیزی بشه برای یه کنترل تعریف کرد یا یه ویندوز سرویس بنویسم و سرویس خیلی کارو راحت میکنه احتمالا و بلافاصله در زمان قطع یا وصل میتونه برنامه رو با خبر کنه ولی چطوریشو نمیدونم.
    حالا روش شما کاملا منطقی کار میکنه ولی بسته به تیک تایمر همه فرم ها رو دائما درگیر میکنه و چون اکثر فرمها با دیتابیس درگیرن روی پرفورمنس برنامه فکر نکنم اثر مطلوبی داشته باشه.بازم اگه راهنمایی دیگه ای دارید ممنونم میشم

  4. #4
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    34
    پست
    138

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    اگر راهی غیر از این به ذهنم رسید چشم حتما خبرتون میدم ولی چیزی که هست این با یه Global Event Handler فرقی نداره ، چون شما قرار نیست بابت هر فرم یه Checker جداگانه فراخوانی کنین ، توجه کنین که کلاس استاتیک هستش ، یعنی یه instance از اون برای کل برنامه کافیه ، تقریبا همون سرویس میشه ، چون به هر حال سرویس که بالاخره باید 1 بار رو چک کنه ! این کد هم همین کارو میکنه.

    ** آپدیت : ضمنا پیشنهاد میکنم در خصوص اتصال زیاد وسواس به خرج ندین ! حتی سرویس هایی مثل Gmail هم 4...5 ثانیه طول میکشه تا متوجه قطع اینترنت بشن ، انتظار نداشته باشین نرم افزار شما Hard Realtime باشه.

  5. #5
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    مرسی والبته حرف شما درسته حالا فعلا تقریبا همین کد شما رو بنا به کاربری برنامه دارم تغییر میدم و مینویسم ببینیم چی میشه ولی در کل با تایمر تو برنامه خیلی اوکی نیستم چون وقتی سی پی یو رو مانیتور میکنی و البته همزمان اس کیو ال هم رو سیستم هست واقعا و محسوسا پراسس سی پی یو بالا میره البته در مورد سرویس هم همینطوره که شما میفرمایید فقط فکر کردم چون مدیریتشو خود ویندوز انجام میده شاید راحت تر باشه.
    بازم ممنون و سپاس از شما دوست عزیز و البته اگه راه بهتری هم به ذهنتون رسید واقعا خوشحال میشم بفریمایید.ممنون

  6. #6

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    با سلام

    دوست عزیز برای اینکه CPU خیلی درگیر نباشه میتونی از یه ترد استفاده کنید بعد تو تردت میتونی از کلاس AutoResetEvent جهت بهینه سازی منابع مصرف CPU استفاده کنید

  7. #7

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام
    شما باید منطق برنامه رو عوض کنید.
    اول بدونید که امکان بررسی وجود اینترنت به طور قطعی نیست.
    باید مثل بقیه برنامه ها عمل کنید. یعنی همون لحظه که کار دارید وصل شید و انتظار گرفتن خطای اتصال به اینترنت رو داشته باشید.
    بهتره این عملیات تغییر دیتابیس رو به صورت زمان بندی شده انجام ندین(به همون دلایلی که خودتون دیدین و دلایل دیگه) ، بلکه یک قسمت جدا گانه برا این عملیات در برنامه آماده کنید، تا کاربر به خواست خودش هر لحظه که مایل بود این عملیات پر هزینه رو انجام بده .
    در مورد قسمتهای دیگه سوالتون هم عرض کنم که باید از تکنیک های چند پردازشی استفاده کنید(وابسته به هیچ فرمی نباشه ) که خودش دنیایی هست و در این پست نمی گنجه.

  8. #8

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    لینک زیر رو ببینید
    https://www.c-sharpcorner.com/articl...nection-state/

    کد چک کردن وضعیت کانکشن رو در یک کلاس (استاتیک) قرار بدید. میتونید یک رویداد هم ایجاد کنید که در صورت تغییر در وضعیت کانکشن فراخوانی بشه.
    یک فرم پایه ایجاد کنید که از اون رویداد استفاده کنه و ...
    بقیه فرمها رو از فرم پایه مشتق کنید.

  9. #9
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    ممنون از راهنمایی همه عزیزان
    اول اینکه جناب احمدی بنده اطلاعی از کلاس
    AutoResetEvent و کاربردش ندارم که خوب باید سرچ کنم و بررسی ممنون که فرمودید.
    جناب P32_64 اول بابت راهنماییتون سپاس - راستش در مورد منطق برنامه ما، برنامه از شرکتهای زیر شاخه نفت و پتروشیمی هست و به نوعی با بورس هم در ارتباطه و خیلی امکان تغییر منطق برنامه رو نداریم و مدیران شرکت هم خیلی حاضر به تغییر سیاست کاری نیستن حتی نرم افزاری دیگه خودتون احتمالا دارین همینجا زندگی میکنین. و البته ما بصورت تئوری کیس استادی های مختلفی رو بررسی کردیدم تا به این حالت الان رسیدیم. درمورد بحث چک کردن کانکشن برنامه های زیادی رو دیدم که در لحظه کانکشن رو چک میکنن راستش اینکه بگیم نمیشه که تو مخ من نمیره شاید بگم با سی شارپ نمیشده ولی تا حالا نشده مشکلی رو بدون راه حل ول کنم پس اینم شدنی هست و خوشحال میشم نتیجه کار رو برای همه بزارم اینجا شاید بدرد دیگر دوستان هم بخوره. در مورد دیتابیس واقعا بهترین حالت هست شرایط کنونی ولی تو بحث برنامه سی شارپی بحث ترد هم کار شده ولی بازم پرفورمنس برنامه پایین هست و مشکل دسترسی همه فرمها به وضعیت کانکشن هست در حداقل زمان تازه الان لوکال هست و ما باید در نهایت بصورت کلاینت سرور دربیاریم که حدود 60 تا 70 تا کلاینت خواهند بود البته که بحث ترد قطعی خواهد بود ولی بازم گفتم شاید دوستانی باشن که قبلا این مورد رو داشتن و راه حل بهتر و هوشمندانه تری پیدا کردن. بازم از وقتی که گذاشتی و راهنماییتون ممنونم.
    و در نهایت اقا محمد از راهنمایی و لینک خوبت ممنون در حال بررسی هستیم نتیجه رو اینجا میزارم انشالله و اگه باز هم راه بهتری بود ممنون میشم اطلاع بدید.
    البته امروز یکی میگفت تو CLR راحت میشه این کار رو انجام داد ولی چطوریشو نمیدونم و نشدیدم و نمیدونم چه کار متفاوتی میشه انجام داد و دسترسی به اون شخصم ندارم اگه دوستان اطلاعی دارن لطفا بفرمایید. یه پیشنهاد دیگه هم بود که تو C++‎‎‎‎ میشه بعد یه DLL بساز تو سی شارپ استفاده کن که ایشون هم به دلیل کمبود وقت همینو گفتن و بای دادن نمیدونم تو C++‎‎‎‎ برای این مورد چی کار میشه کرد.؟؟!!
    در نهایت فکر کنم باید یه روش ترکیبی رو پیدا کرد و البته خودم امروز به API ویندوز هم فکر میکردم که از طریق API شاید بشه سریع تر کانکشن رو بررسی کرد اونم ازطریق یه ویندوز سرویس و در صورت تغییر کانکشن اونوقت سرویس یه همه فرمهای باز اطلاع بده!!
    بازم از همه ممنون

  10. #10
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    34
    پست
    138

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    دوست خوبم امیدوارم راه حلی بهینه پیدا کنین و با ما در اشتراک بذارین تا استفاده کنیم ،

    اما در نظر داشته باشین با توجه به حساسیت شما نسبت به پرفکت بودن نرم افزار باید خدمتتون عرض کنم شما هر کاری انجام بدین باید و تاکید میکنم باید از تایمر ها و یا چیزی شبیه به اونا استفاده کنین ، چرا ؟ چون اساسا و کلا ماهیت ویندوز Timer/Tick based هستش ، شما ببینین حتی CPU هم با تیک ها کار میکنن ، حتی در سطوح پایین تر مدارات الکترونیکی هم به همچنین !!!

    پس در نظر داشته باشین شما نمیتونین چیزی رو چک کنین بدون اینکه CPU درگیر بشه ، اما میتونین بهینه ترین راه رو انتخاب کنین ، در خصوص Win API و C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎‎ باید خدمتتون عرض کنم در چنین مواردی تقریبا هیچ فرقی به حال CPU و یا نرم افزار شما نمیکنه ، پس نرم افزار رو با WinAPI و درگیر کردن با کدهای unsafe و Native DLL ها unstable نکنین.

    اگر نمیخواین پروسس بررسی اینترنت به دوش ترد شما باشه ، اشکالی نداره ، یه سرویس ویندوزی ساده بنویسین ، میتونین از همون استاتیک کلاسی که بنده خدمتتون فرستادم استفاده کنین و بگین هر وقت اینترنت قطع/وصل شد فلان key رو در رجیستری ویندوز true یا false کنه ، اونوقت شما در هر فرم میتونین مدام اون کلید رو چک کنین اگر true بود یعنی اتصال برقراره اگر false بود یعنی نیست ، باز هم تکرار میکنم در نهایت شما سر و کارتون با تایمر خواهد بود ، حتی اگر event هم تعریف کنین در پس زمینه یه تایمر وجود داره که داره اونو مدام چک میکنه پس زیاد فرقی نمیکنه ، شما اگر Windows Message های اصلی سیستم عامل رو مانیتور کنین شاید در ثانیه هزاران هزار مسیج ، تایمر و تیک رد و بدل میکنن ، اصولا اساس کار همینه ، حتی تکون دادن یه موس از سمت راست تصویر به سمت چپ صدها مسیج مربوط به ماس تولید میشه و صد البته CPU هم درگیر میشه ، حتی برای جابجایی موس ، پس اساس همینه ، چاره ای نیست.


    *** آپدیت :
    ضمنا پیشنهاد میکنم برای بررسی اینترنت یک سرور داخلی(ایران) رو بررسی کنین (البته اگر سرور اصلیتون در ایرانه) چون دسترسی به سرورهای داخلی خیلی خیلی سریعتر و با ping پایینتری صورت میگیره و شبکه ها و روتر ها با سرعت خیلی بیشتری در واقع Handshake یا ack رد بدل میکنن. و اگر سرور اصلی داخلی نیست پیشنهاد میکنم در صورت امکان اونو تعویض کنین و یه سرور داخلی بگیرین.


    *** آپدیت 2 :

    در خصوص روشی که بنده ارسال کرده بودم خدممتون راستش خودم تستش نکرده بودم ، الان کنجکاو شدم و خودم تستش کردم با فاصله بررسی اینترنت هر 1 ثانیه 1 بار ، در کمال تعجب مدام CPU روی صفر درصد بود !!!
    شما به چه شکل تست کردین که میفرمایین CPU درگیر میشه ؟؟

    و اگر شما به چیزی کمتر از هر ثانیه 1 بار نیاز دارین قویا پیشنهاد میکنم معماری نرم افزارتون رو تغییر بدین !!
    آخرین ویرایش به وسیله ShayanFiroozi : پنج شنبه 18 اردیبهشت 1399 در 00:43 صبح دلیل: آپدیت 2

  11. #11
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    وقت بخیر مرسی بابت اطلاعات و وقتی که گذاشتین کد رو چک کردید
    ما بصورت مانیتورینگ و ویرچوال چک کردیم چون بصورت عملی باید قبلش تستای اوکی شده رو به سازمان بدیم و تاییدیه بگیریم. البته که شما کاملا صحیح میفرمایید و کل ویندوز با تایمر درگیر هست منتها ما میخوایم تا جایی که میشه تو برنامه این استفاده رو به حداقل ممکن برسونیم چون یه خطای الگوریتمی میتونه ماجرا درست کنه هرچند ما تو شبیه سازی همه چی رو overload میکنیم ولی به هرحال...
    روی برنامه شما هم داریم کار میکنیم و مورد قبول هست ولی بنده اصرار کردم از این جهت که شاید راه بهتری هم باز باشه.در مورد پرفورمنس داستان کل برنامه ایجوری که ما 3 تا سرور هم داخل و هم خارج از ایران داریم و این سرورها به یه سرور اصلی رو نت در ارتباطه که ارتباط با اون سرور فقط به صورت ماشینی و از طریق 3 سرور دیگه هست و کاربرها هرگز امکان دسترسی ندارن حالا هرشرکت تابعه یه دیتابیس لوکال کوچیک داره که کلاینتهای خودش به او سرور لوکال متصلن و سرور لوکال باز ماشینی به یکی از اون 3 سرور متصله و تمام شعب شرکت اصلی چه داخل و چه خارج به هم اینجوری متصلن و چون دارن در لحظه باهم اعداد بورسی رو چک میکنن اگه یکی قطع بشه باید بقیه بلافاصله متوجه بشن که کار اونو انجام بدن (بصورت نرم افزاری )) که خللی وارد نشه ( نکته جالب اینکه که ما به شدت توصیه کردیم خط فیزیکی اینترنت رو safe کنن نه نرم افزاری یه کار بیهوده ولی حالا هردورو میخوان !!) اونور قضیه تا حدودی حله بجز مشکلات داخلی که دیگه خودتون میدونید و حالا باید این قطع و وصل بصورت گسترده به همه فرمهای همه کلاینتها در تمام شعب برسه ( هدف اینکه که همه اپراتورها به هر شکل ممکن از قطع شدن یه کلاینت در هر زونی یا کلاینتی مطلع شن !).چیزی که ما تالان انجام دادیدم تقریبا شبیه کار شما هست مضاف به اینکه یکی از دوستان برای اینکار یه سرویس ویندوزی نوشتن که کلا این تردی که با تایمر کار میکنه رو مدیریتشو بندازه گردن خود ویندوز و تو ویندوز سرور و 10 خیلی مدیریت بهتری انجام میشه. این کل ماجرا بود. یه نکته کوچولو هم هست و اینکه اون کلاینتی که دسترسی به نت رو از دست میده هم باید خودش مطلع بشه و هم سرور به بقیه اطلاع بده که مثلا من فلان کلاینت در فلان نقطه در فلان بازه کاری رو از دست دادم. - مرحله بعد یه چیزی مثل لودبالانسینگ هست که باید وظیفه اون سیستمی که دسترسیش قطع شده رو بین بقیه توزیع کنه .
    و ته قضیه اینجوری هست که یه برنامه بیسی رو قبلا یه شرکن هندی برای این شرکت نوشته که الان اون شرکت با شرکت دیگه یا ادغام شده و گرید کاریش عوض شده و اصلا خدماتی و سورسی از برنامه رو در اختیار ما نمیده ولی اون برنامه تا دلتون بخواد تایمر داره و نحوه کارش با دیتا بیس فاجعه هست هرچند ظاهرا همه اصول رو رعایت کرده ولی داغونه!! و چون تعداد کوئری ها و پردازش ها خیلی بالاست اینجاست که ما مجبوریم رو پررفورمنس برنامه و تیونینگ برنامه و دیتابیس خیلی کار کنیم و شرایط جوری هست که خارج کردن اون برنامه در حال حاضر به شدت زمانبر و پرهزینه هست تا در دراز مدت بشه این کارو کرد - البته یه شرکت خارجی هم هست که طرف قرارداده و جالبه که فقط برنامه اون شرکت هندی رو قبول داره ( چ شود؟!!) برای همین ما از تایمر میترسیم و میدونیم که اساسی فشار میاره به سیستم.- خداوند ما رو هم رحمت کنه تا این پروژه تموم شه!!

    مرسی

  12. #12
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    3 تا روش چک کانکشن هست با توجه به راه حل تایمری شما تا اینجا که کاملا اوکی هست فقط الان بحث روش مطلع کردن همه فرمها در همه کلاینتها مونده:
    من 3 تا روش رو میذارم دوستان هم استفاده کنن




    //! Check Internet Connection & www.000.ir = Connect and Valid.
    public static bool NetState()
    {
    try
    {
    Ping myPing = new Ping();
    String host = "www.000.ir";
    byte[] buffer = new byte[32];
    int timeout = 1000;
    PingOptions pingOptions = new PingOptions();
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    return (reply.Status == IPStatus.Success);
    }
    catch (Exception)
    {
    return false;
    }
    }


    //! Check Media Type Connect to ther Internet.
    public static string GetConnectionType()
    {
    string connctionType = "";
    NetworkInterface[] nif = NetworkInterface.GetAllNetworkInterfaces();


    foreach (NetworkInterface adapter in nif)
    {
    if (adapter.OperationalStatus == OperationalStatus.Up)
    {
    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
    {
    connctionType = "wifi";
    }
    }
    else
    {
    connctionType = "lan";
    }
    }
    return connctionType;
    }


    //! Check Connect or Disconnect & Connection Type of Connection Internet...
    public static Tuple<bool, string> NetInfo()
    {
    bool netState = false;
    string connctionType = string.Empty;


    NetworkInterface[] nif = NetworkInterface.GetAllNetworkInterfaces();


    try
    {
    Ping myPing = new Ping();
    String host = "www.000.ir";
    byte[] buffer = new byte[32];
    int timeout = 1000;
    PingOptions pingOptions = new PingOptions();
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    netState = (reply.Status == IPStatus.Success);
    }
    catch (Exception)
    {
    netState = false;
    }




    foreach (NetworkInterface adapter in nif)
    {
    if (adapter.OperationalStatus == OperationalStatus.Up)
    {


    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
    {
    connctionType = "wifi";
    }
    }
    else
    {
    connctionType = adapter.NetworkInterfaceType.ToString();
    }
    }


    return new Tuple<bool, string>(netState, connctionType);
    }


    همونطور که فرمودید اساس پینگ خودش بر مبنای تایمر هست
    آخرین ویرایش به وسیله hotcat : پنج شنبه 18 اردیبهشت 1399 در 10:18 صبح

  13. #13
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    34
    پست
    138

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    دوست گرامی ،

    Ping روش مناسبی نیست برای این کار نیست ، پس به همین خاطره که شما با overload پردازنده و یا کندی نرم افزارتون مواجه هستید ، روشی که Ping هاست مقابل رو چک میکنه دارای TimeOut هستش و تا زمان فرارسیدن TimeOut و دریافت پاسخ از هاست مقابل ترد شما یه حالت نیمه هنگ پیدا میکنه و شما احساس میکنین نرم افزار کنده !!

    تقریبا متوجه معماری شما شدم و پیشنهاد بنده اینه که حتما برین سراغ Socket Programing ، شما نمیتونین تمام شبکه رو مانیتور کنین و یا با SQL هاست ها رو چک کنین ، نه اینکه غیر ممکن باشه ، خیر ، بهینه نیست.

    پیشنهاد میکنم شما با یک معماری Socket programming مناسب از وضعیت کلاینت ها ، سرور ها و دستگاه های دیگه باخبر بشین و این هیچ باری روی نرم افزار شما نداره Wininet خودش مدیریت میکنه ، خلاصه کنم دقیقا عین Yahoo Messenger و یا تلگرام که وقتی یک کاربر آنلاین و یا آفلاین میشه وضعیت اونو به کل شبکه Broadcast میکنه و شما در کلاینت مثلا تلگرامتون میبینین که طرف آفلاین یا آنلاین شد بدون اینکه هیچ منبع خاصی از سیستم شما درگیر این موضوع باشه ، اینو به دوش سرور بندازین نه هر کلاینت واسه خودش همه کار کنه.
    آخرین ویرایش به وسیله ShayanFiroozi : جمعه 19 اردیبهشت 1399 در 13:47 عصر

  14. #14

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام
    اگه منظورتون اینه که چجوری میشه رویدادی را ایجاد کرد تا وقتی کامپیوتر طرف ، به اینترنت وصل یا قطع شد ، به برنامه تون خبر بده (تا لازم نباشه مدام در تایمر ، قطع یا وصل بودن اینترنت را چک کنید) ، باید از اطلاعات Event Viewer استفاده کنید .

    اطلاعات قطع و وصل شدن اینترنت هم در برنامه ی Event Viewer ، در مسیر "Applications and Services Logs/Microsoft/Windows/UniversalTelemetryClient/Operational" و در ستون Event ID ، با شماره ی 55 ذخیره میشه (هر وقت اینترنت وصل بشه ، مقدار Message اش "Is the Internet available: true" و هر وقت هم اینترنت قطع بشه ، مقدار "Is the Internet available: false" داده میشه) .



    توسط کلاس EventLog در سی شارپ :

    https://docs.microsoft.com/en-us/dot...t-plat-ext-3.1

    میتونین با برنامه ی Event Viewer تعامل برقرار کنید و هر وقت ، پیام و یا رویدادی در اونجا اتفاق افتاد ، به برنامه ی شما هم اطلاع بده .
    اما من دقیق متوجه نشدم که چجوری میشه پیام قسمت "Applications and Services Logs/Microsoft/Windows/UniversalTelemetryClient/Operational" را رصد کرد .
    از دوستان بپرسید ، شاید بدونند .
    شاید هم کلاس های دیگه هم در سی شارپ برای کار با Event Viewer باشه .


  15. #15
    کاربر دائمی آواتار ShayanFiroozi
    تاریخ عضویت
    شهریور 1397
    محل زندگی
    بندرعباس ، خلیج همیشه فارس
    سن
    34
    پست
    138

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام ، در هر صورت برنامه زیر بار میره ، ایشون میخوان تقریبا هیچ باری روی نرم افزارشون نباشه !!! و در ضمن فقط بحث اینترنت نیست ، نرم افزار باید تقریبا تمام کلاینت ها رو رصد کنه ، اینطور به نظر میاد سوکت پروگرامینگ به روش یاهو مسنجر و یا تلگرام بهترین و بهینه ترین روشه

  16. #16

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام
    تا منظورتون از زیر بار رفتن ، چی باشه . اگه منظورتون اینه که ولو اندک ، از منابع سخت افزار و نرم افزار استفاده کنه ، شما ساده ترین کد را هم اجرا کنید ، باز هم به منابع سخت افزار و نرم افزار برای اجرا نیازمند هست .
    اگه منظورتون اینه که سربار استفاده از event viewer و کلاس های مربوط بهش در سی شارپ ، از اینی که مدام در تایمر یه کدی را چک کنیم ، بیشتر یا برابر هست ، قطعا این طور نیست .
    از این دست پیام های ویندوز ، بسیار زیاد اتفاق میافته و برنامه های زیادی از پیام های ویندوز استفاده میکنند.

    -------------------------------------

    به هر حال ، میتونین از این کد استفاده کنین که از استادم (the king) گرفتم (در ویندوز 10 کار میکنه اما در ویندوزهای دیگه را نمیدونم . اگه در ویندوزهای دیگه کارنکنه ، بخاطر ویندوز هست که قابلیت UniversalTelemetryClient را نداره) :


    private System.Diagnostics.Eventing.Reader.EventLogWatcher _watcher;


    private void button1_Click(object sender, EventArgs e)
    {
    var query = new System.Diagnostics.Eventing.Reader.EventLogQuery
    ("Microsoft-Windows-UniversalTelemetryClient/Operational", System.Diagnostics.Eventing.Reader.PathType.LogNam e, "*");
    _watcher = new System.Diagnostics.Eventing.Reader.EventLogWatcher (query);
    _watcher.EventRecordWritten += Watcher_EventRecordWritten;
    _watcher.Enabled = true;
    }


    private void Watcher_EventRecordWritten(object sender, System.Diagnostics.Eventing.Reader.EventRecordWrit tenEventArgs e)
    {
    MessageBox.Show(e.EventRecord.FormatDescription()) ;
    }


    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    _watcher?.Dispose();
    }


    در رویداد Watcher_EventRecordWritten ، میتونین برای اون مقدار ID و Message اش که گفته بودم ، شرط بذارین .
    البته دقت کنید که سرویس مروط به این کار هم در ویندوز باید فعال باشه تا کد بالا کار کنه .
    آخرین ویرایش به وسیله SajjadKhati : شنبه 20 اردیبهشت 1399 در 16:02 عصر

  17. #17

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک
    ممنون از راهنمایی همه عزیزان
    اول اینکه جناب احمدی بنده اطلاعی از کلاس
    AutoResetEvent و کاربردش ندارم که خوب باید سرچ کنم و بررسی ممنون که فرمودید.
    جناب P32_64 اول بابت راهنماییتون سپاس - راستش در مورد منطق برنامه ما، برنامه از شرکتهای زیر شاخه نفت و پتروشیمی هست و به نوعی با بورس هم در ارتباطه و خیلی امکان تغییر منطق برنامه رو نداریم و مدیران شرکت هم خیلی حاضر به تغییر سیاست کاری نیستن حتی نرم افزاری دیگه خودتون احتمالا دارین همینجا زندگی میکنین. و البته ما بصورت تئوری کیس استادی های مختلفی رو بررسی کردیدم تا به این حالت الان رسیدیم. درمورد بحث چک کردن کانکشن برنامه های زیادی رو دیدم که در لحظه کانکشن رو چک میکنن راستش اینکه بگیم نمیشه که تو مخ من نمیره شاید بگم با سی شارپ نمیشده ولی تا حالا نشده مشکلی رو بدون راه حل ول کنم پس اینم شدنی هست و خوشحال میشم نتیجه کار رو برای همه بزارم اینجا شاید بدرد دیگر دوستان هم بخوره. در مورد دیتابیس واقعا بهترین حالت هست شرایط کنونی ولی تو بحث برنامه سی شارپی بحث ترد هم کار شده ولی بازم پرفورمنس برنامه پایین هست و مشکل دسترسی همه فرمها به وضعیت کانکشن هست در حداقل زمان تازه الان لوکال هست و ما باید در نهایت بصورت کلاینت سرور دربیاریم که حدود 60 تا 70 تا کلاینت خواهند بود البته که بحث ترد قطعی خواهد بود ولی بازم گفتم شاید دوستانی باشن که قبلا این مورد رو داشتن و راه حل بهتر و هوشمندانه تری پیدا کردن. بازم از وقتی که گذاشتی و راهنماییتون ممنونم.
    و در نهایت اقا محمد از راهنمایی و لینک خوبت ممنون در حال بررسی هستیم نتیجه رو اینجا میزارم انشالله و اگه باز هم راه بهتری بود ممنون میشم اطلاع بدید.
    البته امروز یکی میگفت تو CLR راحت میشه این کار رو انجام داد ولی چطوریشو نمیدونم و نشدیدم و نمیدونم چه کار متفاوتی میشه انجام داد و دسترسی به اون شخصم ندارم اگه دوستان اطلاعی دارن لطفا بفرمایید. یه پیشنهاد دیگه هم بود که تو C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎ میشه بعد یه DLL بساز تو سی شارپ استفاده کن که ایشون هم به دلیل کمبود وقت همینو گفتن و بای دادن نمیدونم تو C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎ برای این مورد چی کار میشه کرد.؟؟!!
    در نهایت فکر کنم باید یه روش ترکیبی رو پیدا کرد و البته خودم امروز به API ویندوز هم فکر میکردم که از طریق API شاید بشه سریع تر کانکشن رو بررسی کرد اونم ازطریق یه ویندوز سرویس و در صورت تغییر کانکشن اونوقت سرویس یه همه فرمهای باز اطلاع بده!!
    بازم از همه ممنون
    درود دوست عزیز
    امیدوارم که مشکلتون رو حل کرده باشید در غیر اینصورت چند تا مطلب هستش :
    در ابتدا بگم که منظور من که تغییر سیاست کاری شرکت نبود! از کجا همچین چیزی رو برداشت کردید ؟!!!
    بگذریم ...
    منظورم من اینه : اشتباه هستش که برنامه رو بیهوده مشغول چک کردن اتصال به اینترنت بکنید.
    کلا برنامه ها نباید دائما چیزی رو چک کنن ، بلکه باید اجازه بدید سیستم عامل شما رو مطلع کنه. برنامه دانود منیجرتون یا مرورگر اصلا نمیاد دائمی اتصال به اینترنت رو چک کنه(چون اصلا نمیشه) .بلکه مشغول انجام عملیات اصلی میشه و هرجا به خطا رسید (اینترنت قطع شد) به کاربر اطلاع میده .
    شما هم باید این طور عمل کنید .دستورات تعامل با پایگاه داده رو انجام بدید و در صورت خطا به کاربر بگید که اینترنت در دسترس نیست . به طور خلاصه منظور من اینه که برسی برقرار بودن اتصال رو از انجام عملیات جدا نکنید.
    مورد بعدی اینه که این عملیات تست اتصال و عملیات مربوط به پایگاه داده رو از رابط برنامه (فرم ها)جدا کنید. وقتی جدا باشه راحت میشه در هر فرمی که میخواید ازش استفاده کنید .منظورم از جدا سازی اینه که در کلاس هیچ فرمی نباشه ، یک قسمت جدا بدون ظاهر گرافیکی.
    تازه با این معماری میتونید یک سیستم "کش" مناسب پیاده سازی کنید و کارایی کد شبکه و دیتابیس رو بالا ببرید.
    در اخر این که چون برنامه تون باید در نهایت به معماری کلاینت سرور تبدیل شه بهتره از ترد بهره ببرید، البته مستقیم خودتون رو در گیر Threading API نکنید بلکه از api های جدید تر مثل Asynchronous Programming استفاده کنید.
    به جای سوکت هم میشه از wcf استفاده کرد برا بخش شبکه برنامه تون.
    البته این ها همه در حد پیشنهاد بودن و اصراری در کار نبود .موفق باشید.

  18. #18
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    سلام و ممنون از همه عزیزان ببخشید این چندروز شدید دیگه درگیر بودیم
    مرسی بابت راهنمایی ها تقریبا همه دوستان (اقا سجاد ، اقای فیروزی و استاد PE) صحیح میفرمایید و همه روشها کار میکنه فقط باید طی یه بازه زمانی روشهای مختلفو بسته به هر پروژه ای مانیتور کرد تا دید کدوم بهتر جواب میده.راه حلی که ما فعلا داریم کد میزنیم و قراره بره برای تست نهایی به این شکل شد:
    سرور اصلی قراره یه سرویس براش نوشته بشه که درواقع کنترل کانکشانها از طریق سرور اصلی چک میشه هرکلاینت یه سرویس مستقل داره که کاری به برنامه در حال اجرا نداره و در واقع این سرویس ها هستن که همدیگه رو چک میکنن ( که من دیگه اینجا به بعد رو اطلاع ندارم و یکی از بچه ها شبکه مینویسه - ) به اینصورت که یه توکن لوکال داریم که هروقت قطع شد سرور لوکال فلگ مربوط به اون کلایتنت رو روی سرور آف میکنه و سرور به سرویس لوکال 3 تاسرور و سرور ها به همه کلاینتها و فرمهاشون اطلاع میدن این کلیت داستان شده.
    حالا باید دید در عمل چی میشه ( البته به نظر شخصی من خیلی جالب نیست چون کلی فلگ تو حالتهای مختلف باید چک بشن و این باز کار سرور رو زیاد میکنه ولی فعلا قرار شده این روش تست بشه.بازم مرسی و خوشحالم که روشهای مختلفی پیشنهاد شد انشالله نتیجه بگیریم - البته حالا یه بحث جدید باز شده و اون اینکه حالا این سرویسها از چ روشی میتونن سریعتر با هم در ارتباط باشن؟!!! درواقع سرویسها یه بحث هستن و پروتوکلهای شبکه یه بحث دیگه و امنیت هم خودش یه داستانه!!
    بازم ممنون و بازم اگه پیشنهادی بود بفرمایید 100% خوشحال میشم و قطعا همه موارد گفته شده رو با همکارام درمیون میزارم و درموردشون نظرسنجی میکنیم.
    درود و سپاس فراوان

  19. #19

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک
    سلام و ممنون از همه عزیزان ببخشید این چندروز شدید دیگه درگیر بودیم
    مرسی بابت راهنمایی ها تقریبا همه دوستان (اقا سجاد ، اقای فیروزی و استاد PE) صحیح میفرمایید و همه روشها کار میکنه فقط باید طی یه بازه زمانی روشهای مختلفو بسته به هر پروژه ای مانیتور کرد تا دید کدوم بهتر جواب میده.راه حلی که ما فعلا داریم کد میزنیم و قراره بره برای تست نهایی به این شکل شد:
    سرور اصلی قراره یه سرویس براش نوشته بشه که درواقع کنترل کانکشانها از طریق سرور اصلی چک میشه هرکلاینت یه سرویس مستقل داره که کاری به برنامه در حال اجرا نداره و در واقع این سرویس ها هستن که همدیگه رو چک میکنن ( که من دیگه اینجا به بعد رو اطلاع ندارم و یکی از بچه ها شبکه مینویسه - ) به اینصورت که یه توکن لوکال داریم که هروقت قطع شد سرور لوکال فلگ مربوط به اون کلایتنت رو روی سرور آف میکنه و سرور به سرویس لوکال 3 تاسرور و سرور ها به همه کلاینتها و فرمهاشون اطلاع میدن این کلیت داستان شده.
    حالا باید دید در عمل چی میشه ( البته به نظر شخصی من خیلی جالب نیست چون کلی فلگ تو حالتهای مختلف باید چک بشن و این باز کار سرور رو زیاد میکنه ولی فعلا قرار شده این روش تست بشه.بازم مرسی و خوشحالم که روشهای مختلفی پیشنهاد شد انشالله نتیجه بگیریم - البته حالا یه بحث جدید باز شده و اون اینکه حالا این سرویسها از چ روشی میتونن سریعتر با هم در ارتباط باشن؟!!! درواقع سرویسها یه بحث هستن و پروتوکلهای شبکه یه بحث دیگه و امنیت هم خودش یه داستانه!!
    بازم ممنون و بازم اگه پیشنهادی بود بفرمایید 100% خوشحال میشم و قطعا همه موارد گفته شده رو با همکارام درمیون میزارم و درموردشون نظرسنجی میکنیم.
    درود و سپاس فراوان
    بسیار عالی !
    سوالاتی داشتم من :
    سرور و سرویس ها فقط برا بررسی وضعیت انلاین بودن ایجاد میشن؟ یعنی وضعیت دیگه ای هم در سرور نگه داری میشه ؟
    شما این سناریو(دو دیتابیس لوکال و غیر لوکال) رو برا داشتن یکجور Cache استفاده می کنید ؟
    دونستن وضعیت اتصال به اینترنت برا کاربر برنامه مفیده یا برا پیاده سازی برنامه ؟

  20. #20
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    وقت بخیر
    عرض کنم سرورها که خیر در واقع سرور دیتابیس هستن.ببینید کل داستان سرورها اینجوریه که اگه شنیده باشید که حتما شنیدید الان دیگه به خاطر پروسه های سنگین میان از سرورهای توزیع شده استفاده میکنن مخصوصا برای بیگ دیتا یا ماینینگ مثل مثلا هدوپ.یا بورس نزدک اصلا کل این گرفتاری ما از وقتی بود که کارفرما با سیستم و الگوریتم نزدک اشنا شد و البته خداییش پرفرمنس فوق العاده ای داره این نزدک با سرور sql و 2پتا بایت دیتای سالیانه!! فوق العاده سریع هم کوئری ها رو جواب میده هم پراسس ها رو با سیستم لود بالانسینگ هم سخت افزاری و هم نرم افزاری انجام مبده - حالا بجای اینکه یه پروسه سنگین رو بیان براش چندینو چند سرور گرون قیمت بزارن میان بین کلاینتها این پروسه رو پخش میکنن کاری که الان چند شرکت دارویی بزرگ دنیا برای پی بردن به ساختار الگوریتم دی ان ای همین کرونا دارن انجام میدن و شما هم میتونید بهشون کمک کنید و سیستمتونو در اختیار بزارید یا ناسا یا حتی گوگل که البته مخفیانه این کارو کرد و چند سال پیش اروپا یه جریمه سنگین کرد و غرامت گرفت و تقریبا از همه کامپیوتر های دنیا که یه برنامه ای از گوگل رو داشتن و پراسس گوگل رو سیستم بالا میومد ازشون استفاده کردن ( کلی حجم نتمون همیجوری رفت) حالا داستان ما هم همینه منتها در اکثر موارد که بحث مالی مهم نباشه اگه یه کلاینتی قطع شه ممکنه حتی لود بالانسینگی هم انجام نشه صرفا پروسه کمی کند تر بشه ولی تو بحث مالی و زمانی مهمه که کار کلاینت قطع شده بارش رو بقیع کلاینتها بدوش بکشن تا دوباره اون کلاینت به سیستم متصل شه و این کار رو ما الان گردن سرورها گذاشتیم و سرور اون کلاینتی که اینترنت بهتری داره و توان بالاتر رو انتخاب میکنه و تنها کاری که میکنه یه فرم دیگه به فرمهای باز اون سیستم اضافه میشه. این دلیل توزیع هست . دلیل اینکه خود کاربر کلاینت هم با خبر شه اینهکه شاید کاربر در اون لحظه حواسش نباشه یجوری مطلع بشه و سریع سعی کنه مشکل رو برطرف کنه تا بار اضافی از روی بقیه سیستمها برداشته بشه.
    حالا نکته اینکه ( که البته من از اول اصرار داشتم ولی شاید منظورمو خوب نرسوندم - البته عنوان تاپیک دقیقا همینه یعنی کاری که سیستم داره انجام میده رو ما فقط مطلع بشیم و نه اینکه دوباره همون کار رو تو برنامه خودمون تکرار کنیم - اطلاع از یه رویداد سیستمی)- یسری کارهارو سیستم عامل داره انجام میده حالا بجای اینکه از همون استفاده کنیم نیایم چرخو دوباره اختراع کنیم و مثلا ویندوز خودش نت رو داره چک میکنه منم بیام حالا یه تایمر اضافه کنم بازم اینکارو جدا انجام بدم... و وقتی تعداد زیاد شده تو فشار بار زیاد کوئری ها اونوقت خودشو نشون میده.
    الان به پیشنهاد خوب دادن اقا سجاد که همین شد یه ایده البته یکی از بچه های امنیت داره کد میزنه و من اطلاعی از این کار ندارم ولی دارم دنبال مستنداتش میگردم هرچند که خیلی کمه و خیلی سخت و این اونکه یه هوک برای ویندوز مینویسن ( ظاهرا هوک کردن به روشی گفته میشه که شما مسیر اینتراپت سیستمی رو به مسیر دلخواه هدایت کنی یه چیزی مثل ویروس) که ایونت مربوط به ایونت ویوور علاوه بر خود Event ویوور ویندوز و اینتراپت مربوطه بیاد یه پیام هم به سرویس برنامه ما بده و این دقیقا میشه همون کاری که ما میخوایم از خود سیستم استفاده میکنیم و کار اضافه ای انجام نمیشه و مدیریت این داستان به بهترین شکل توسط خود OS انجام میشه.البته چون این کار کلا تو بخش دیگه ای انجام میشه بعید بدونم به کدش دسترسی داشته باشم ولی اگه شد حتما اینجا میزارم. اگه دوستانی هم هستن بلدن چطور میشه یه هوک ویندوزی نوشت خوشحال میشم به بنده هم اطلاعاتی رو بدن و نحوه کار رو توضیح بدن یا لینک خوبی ازش سراغ دارن رو بزارن.
    امیدوارم توضیحات کافی باشه
    مرسی از همه

  21. #21
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    البته اینم بگم که راحتترین راه پرداخت هزینه یه لایسنس سفارشی ویندوز به مایکروسافت هست و نوشتن سرویس مربوطه برای اینکه این کار رو مایکروسافت انجام بده براتون ولی هزینه این کار سر به فلک میزنه چون شما باید برای هر سرور هر کلاینت و کلاینتهایی که بعدا ممکنه اضافه بشن پول لایسنس رو بدی و خودتو وابسته 100% یه محصولات مایکروسافت کنی + اینکه برنامه نوشته شده باشد با یکی از محصولات مایکروسافت نوشته شده باشه مثلا دات نتی ها و خود اون IDE باید لایسنس داشته باشه. - اینجوری میشه فهمید چطوری بیل گیتس به یه ثروت هیولایی رسیده و تو دنیای حرفه ای و کشورهای صنعتی داستان اینجوری درواقع!! و نوشتن یه هوک یه چیزی تو مایه های کرک یا هک هست احتمالا و غیر مجاز و شما باید پول سنگینی رو پرداخت کنی

  22. #22

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک
    وقت بخیر
    عرض کنم سرورها که خیر در واقع سرور دیتابیس هستن.ببینید کل داستان سرورها اینجوریه که اگه شنیده باشید که حتما شنیدید الان دیگه به خاطر پروسه های سنگین میان از سرورهای توزیع شده استفاده میکنن مخصوصا برای بیگ دیتا یا ماینینگ مثل مثلا هدوپ.یا بورس نزدک اصلا کل این گرفتاری ما از وقتی بود که کارفرما با سیستم و الگوریتم نزدک اشنا شد و البته خداییش پرفرمنس فوق العاده ای داره این نزدک با سرور sql و 2پتا بایت دیتای سالیانه!! فوق العاده سریع هم کوئری ها رو جواب میده هم پراسس ها رو با سیستم لود بالانسینگ هم سخت افزاری و هم نرم افزاری انجام مبده - حالا بجای اینکه یه پروسه سنگین رو بیان براش چندینو چند سرور گرون قیمت بزارن میان بین کلاینتها این پروسه رو پخش میکنن کاری که الان چند شرکت دارویی بزرگ دنیا برای پی بردن به ساختار الگوریتم دی ان ای همین کرونا دارن انجام میدن و شما هم میتونید بهشون کمک کنید و سیستمتونو در اختیار بزارید یا ناسا یا حتی گوگل که البته مخفیانه این کارو کرد و چند سال پیش اروپا یه جریمه سنگین کرد و غرامت گرفت و تقریبا از همه کامپیوتر های دنیا که یه برنامه ای از گوگل رو داشتن و پراسس گوگل رو سیستم بالا میومد ازشون استفاده کردن ( کلی حجم نتمون همیجوری رفت) حالا داستان ما هم همینه منتها در اکثر موارد که بحث مالی مهم نباشه اگه یه کلاینتی قطع شه ممکنه حتی لود بالانسینگی هم انجام نشه صرفا پروسه کمی کند تر بشه ولی تو بحث مالی و زمانی مهمه که کار کلاینت قطع شده بارش رو بقیع کلاینتها بدوش بکشن تا دوباره اون کلاینت به سیستم متصل شه و این کار رو ما الان گردن سرورها گذاشتیم و سرور اون کلاینتی که اینترنت بهتری داره و توان بالاتر رو انتخاب میکنه و تنها کاری که میکنه یه فرم دیگه به فرمهای باز اون سیستم اضافه میشه. این دلیل توزیع هست . دلیل اینکه خود کاربر کلاینت هم با خبر شه اینهکه شاید کاربر در اون لحظه حواسش نباشه یجوری مطلع بشه و سریع سعی کنه مشکل رو برطرف کنه تا بار اضافی از روی بقیه سیستمها برداشته بشه.
    حالا نکته اینکه ( که البته من از اول اصرار داشتم ولی شاید منظورمو خوب نرسوندم - البته عنوان تاپیک دقیقا همینه یعنی کاری که سیستم داره انجام میده رو ما فقط مطلع بشیم و نه اینکه دوباره همون کار رو تو برنامه خودمون تکرار کنیم - اطلاع از یه رویداد سیستمی)- یسری کارهارو سیستم عامل داره انجام میده حالا بجای اینکه از همون استفاده کنیم نیایم چرخو دوباره اختراع کنیم و مثلا ویندوز خودش نت رو داره چک میکنه منم بیام حالا یه تایمر اضافه کنم بازم اینکارو جدا انجام بدم... و وقتی تعداد زیاد شده تو فشار بار زیاد کوئری ها اونوقت خودشو نشون میده.
    الان به پیشنهاد خوب دادن اقا سجاد که همین شد یه ایده البته یکی از بچه های امنیت داره کد میزنه و من اطلاعی از این کار ندارم ولی دارم دنبال مستنداتش میگردم هرچند که خیلی کمه و خیلی سخت و این اونکه یه هوک برای ویندوز مینویسن ( ظاهرا هوک کردن به روشی گفته میشه که شما مسیر اینتراپت سیستمی رو به مسیر دلخواه هدایت کنی یه چیزی مثل ویروس) که ایونت مربوط به ایونت ویوور علاوه بر خود Event ویوور ویندوز و اینتراپت مربوطه بیاد یه پیام هم به سرویس برنامه ما بده و این دقیقا میشه همون کاری که ما میخوایم از خود سیستم استفاده میکنیم و کار اضافه ای انجام نمیشه و مدیریت این داستان به بهترین شکل توسط خود OS انجام میشه.البته چون این کار کلا تو بخش دیگه ای انجام میشه بعید بدونم به کدش دسترسی داشته باشم ولی اگه شد حتما اینجا میزارم. اگه دوستانی هم هستن بلدن چطور میشه یه هوک ویندوزی نوشت خوشحال میشم به بنده هم اطلاعاتی رو بدن و نحوه کار رو توضیح بدن یا لینک خوبی ازش سراغ دارن رو بزارن.
    امیدوارم توضیحات کافی باشه
    مرسی از همه
    درود
    یک روش مناسب برا پیاده سازی این سیستم اینه که ابتدا در برنامه کلاینت کد محاسبات رو قرار بدید .به صورت یک component جدا که در یک ترد جدا هم هستش.
    بعد با ابزارهایی مثل Socket Programming یا Windows Communication Foundation برقراری ارتباط بین کلاینت و سرور رو پیاده سازی کنید:
    یعنی کلاینت ها با فرستادن پیام هایی خودشون رو معرفی میکنند (به سرور)
    بعد سرور برای کلاینت های ثبت شده قسمتهایی از کل داده رو میفرسته تا کلاینت بتونه سهم خودش از محاسبات کلی رو انجام بده.
    کلاینت هم میتونه با پیامی نتیجه کارش رو به سرور اطلاع بده و نتیجه محاسبات رو پس بفرسته .
    در این بین میتونید با ارسال پیام و دریافت پاسخ هایی در بازه زمانی مناسب مطلع بشید(سرور) که کدوم کلاینت ها متصل اند و مشغول چه کاری هستند.

  23. #23

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک
    البته اینم بگم که راحتترین راه پرداخت هزینه یه لایسنس سفارشی ویندوز به مایکروسافت هست و نوشتن سرویس مربوطه برای اینکه این کار رو مایکروسافت انجام بده براتون ولی هزینه این کار سر به فلک میزنه چون شما باید برای هر سرور هر کلاینت و کلاینتهایی که بعدا ممکنه اضافه بشن پول لایسنس رو بدی و خودتو وابسته 100% یه محصولات مایکروسافت کنی + اینکه برنامه نوشته شده باشد با یکی از محصولات مایکروسافت نوشته شده باشه مثلا دات نتی ها و خود اون IDE باید لایسنس داشته باشه. - اینجوری میشه فهمید چطوری بیل گیتس به یه ثروت هیولایی رسیده و تو دنیای حرفه ای و کشورهای صنعتی داستان اینجوری درواقع!! و نوشتن یه هوک یه چیزی تو مایه های کرک یا هک هست احتمالا و غیر مجاز و شما باید پول سنگینی رو پرداخت کنی
    هوک اون چیزی که فکر میکنید نیست .
    توضیجات بیشتر اینجا :https://docs.microsoft.com/en-us/win...sg/about-hooks

  24. #24
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط pe32_64 مشاهده تاپیک
    درود
    یک روش مناسب برا پیاده سازی این سیستم اینه که ابتدا در برنامه کلاینت کد محاسبات رو قرار بدید .به صورت یک component جدا که در یک ترد جدا هم هستش.
    بعد با ابزارهایی مثل Socket Programming یا Windows Communication Foundation برقراری ارتباط بین کلاینت و سرور رو پیاده سازی کنید:
    یعنی کلاینت ها با فرستادن پیام هایی خودشون رو معرفی میکنند (به سرور)
    بعد سرور برای کلاینت های ثبت شده قسمتهایی از کل داده رو میفرسته تا کلاینت بتونه سهم خودش از محاسبات کلی رو انجام بده.
    کلاینت هم میتونه با پیامی نتیجه کارش رو به سرور اطلاع بده و نتیجه محاسبات رو پس بفرسته .
    در این بین میتونید با ارسال پیام و دریافت پاسخ هایی در بازه زمانی مناسب مطلع بشید(سرور) که کدوم کلاینت ها متصل اند و مشغول چه کاری هستند.
    بله تقریبا همین روش هست الان دیگه فقط سریعتر شده که بالا توضیح دادم - مرسی

  25. #25
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط pe32_64 مشاهده تاپیک
    هوک اون چیزی که فکر میکنید نیست .
    توضیجات بیشتر اینجا :https://docs.microsoft.com/en-us/win...sg/about-hooks
    عرض کردم بنده فقط شنیده ها رو گفتم اطلاع درستی ندارم ولی تا اونجایی که لینک شما رو دیدم تقریبا همین داستان یعنی خوندن اینتراپتهای ویندوز حالا اینجا موس و کیبورد رو گفته ولی رو هر موردی میشه احتمالا گذاشت که خوب من بیشتر نمیدونم
    به هرحال ممنون عزیز

  26. #26

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک
    وقت بخیر
    حالا نکته اینکه ( که البته من از اول اصرار داشتم ولی شاید منظورمو خوب نرسوندم - البته عنوان تاپیک دقیقا همینه یعنی کاری که سیستم داره انجام میده رو ما فقط مطلع بشیم و نه اینکه دوباره همون کار رو تو برنامه خودمون تکرار کنیم - اطلاع از یه رویداد سیستمی)- یسری کارهارو سیستم عامل داره انجام میده حالا بجای اینکه از همون استفاده کنیم نیایم چرخو دوباره اختراع کنیم و مثلا ویندوز خودش نت رو داره چک میکنه منم بیام حالا یه تایمر اضافه کنم بازم اینکارو جدا انجام بدم... و وقتی تعداد زیاد شده تو فشار بار زیاد کوئری ها اونوقت خودشو نشون میده.
    سلامی مجدد
    وقت تون بخیر.
    اگه میخواین از رویدادهای سیستم عامل استفاده کنین ، به نظرم بهترین روش ، همینی هه که از رویدادهای event viewer که طیف بسیار وسیعی از رویدادهای انواع سخت افزارها و نرم افزارها را پوشش میده ، استفاده کنید .

    کلاس EventLogWatcher در دات نت ، کلاسی برای تعامل با event viewer ویندوز هست :

    https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventing.reader.eventlogwatcher ?view=dotnet-plat-ext-3.1

    البته کلاس EventLog هم هست ولی به نظر میاد که کلاس EventLogWatcher کامل تر باشه . که کد مربوطه را در پست قبلی دادم.

    برای مطلع شدن از رویداد سیستم عامل ، به شخصه استفاده از تایمر و مدام چک کردنِ اینکه آیا یک مسئله ای اتفاق افتاده یا نه را ترجیح نمیدم . کمترین دلیلش ، علاوه بر اصولی نبودن ، سربار ایجاد کردن اضافی برای پردازنده ی کاربر هست (مخصوصا اگه پردازنده ی کاربر ضعیف باشه یا زمان interval در تایمر ، خیلی کم باشه) .
    به نظرم بهترین روش برای متوجه شدن یک رویداد سیستم عامل ، استفاده از همین قضیه ی event viewer هست .

    نقل قول نوشته شده توسط hotcat مشاهده تاپیک

    الان به پیشنهاد خوب دادن اقا سجاد که همین شد یه ایده البته یکی از بچه های امنیت داره کد میزنه و من اطلاعی از این کار ندارم ولی دارم دنبال مستنداتش میگردم هرچند که خیلی کمه و خیلی سخت و این اونکه یه هوک برای ویندوز مینویسن ( ظاهرا هوک کردن به روشی گفته میشه که شما مسیر اینتراپت سیستمی رو به مسیر دلخواه هدایت کنی یه چیزی مثل ویروس) که ایونت مربوط به ایونت ویوور علاوه بر خود Event ویوور ویندوز و اینتراپت مربوطه بیاد یه پیام هم به سرویس برنامه ما بده و این دقیقا میشه همون کاری که ما میخوایم از خود سیستم استفاده میکنیم و کار اضافه ای انجام نمیشه و مدیریت این داستان به بهترین شکل توسط خود OS انجام میشه.البته چون این کار کلا تو بخش دیگه ای انجام میشه بعید بدونم به کدش دسترسی داشته باشم ولی اگه شد حتما اینجا میزارم. اگه دوستانی هم هستن بلدن چطور میشه یه هوک ویندوزی نوشت خوشحال میشم به بنده هم اطلاعاتی رو بدن و نحوه کار رو توضیح بدن یا لینک خوبی ازش سراغ دارن رو بزارن.
    امیدوارم توضیحات کافی باشه
    مرسی از همه
    خوب این که سخت نیست .
    همونطور که گفته شد ، کلاس
    EventLogWatcher برای این کار هست .
    برای استفاده از این کلاس ، مشکل یا سئوالی دارین؟
    بسیار ساده هست . کدی که در پست قبلی دادم را نگاه کنید . جای سختی چندان نداره .

  27. #27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    ببینید دوست عزیز، همونطور که دوستان گفتن شما نیاز به سوکت پروگرمینگ دارین نه مطلع شدن از قطعی اینترنت کلاینت، من کد چک کردن وضعیت اتصال اینترنت رو دارم ولی توی سناریوی شما اصلا به درد نمیخوره، فرضا کاربر یه سری داده از سرور گرفته و داره روشون کار انجام میده که یهو اینترنت اون کلاینت قطع میشه، خب الان وقتی این کلاینت قطعه و هیچ دسترسی ای به اینترنت نداره چجوری میخواد به سرور اطلاع بده که نتش قطعه و نمیتونه کار محوله رو انجام بده؟؟ وضعیت قطع شدن یک کلاینت باید توسط خود سرور تشخیص داده و توی کل شبکه همه پخشی بشه، پس کلاینت با چک کردن اینترنت خودش هیچ کار مفیدی نمیکنه، اما در هر حال اگه بازم کد چک کردن وضعیت اتصال اینترنت رو خواستین بگین توی پروژه هام پیدا کنم و بذارم براتون

  28. #28
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    سلامی مجدد
    وقت تون بخیر.
    اگه میخواین از رویدادهای سیستم عامل استفاده کنین ، به نظرم بهترین روش ، همینی هه که از رویدادهای event viewer که طیف بسیار وسیعی از رویدادهای انواع سخت افزارها و نرم افزارها را پوشش میده ، استفاده کنید .

    کلاس EventLogWatcher در دات نت ، کلاسی برای تعامل با event viewer ویندوز هست :

    https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventing.reader.eventlogwatcher ?view=dotnet-plat-ext-3.1

    البته کلاس EventLog هم هست ولی به نظر میاد که کلاس EventLogWatcher کامل تر باشه . که کد مربوطه را در پست قبلی دادم.

    برای مطلع شدن از رویداد سیستم عامل ، به شخصه استفاده از تایمر و مدام چک کردنِ اینکه آیا یک مسئله ای اتفاق افتاده یا نه را ترجیح نمیدم . کمترین دلیلش ، علاوه بر اصولی نبودن ، سربار ایجاد کردن اضافی برای پردازنده ی کاربر هست (مخصوصا اگه پردازنده ی کاربر ضعیف باشه یا زمان interval در تایمر ، خیلی کم باشه) .
    به نظرم بهترین روش برای متوجه شدن یک رویداد سیستم عامل ، استفاده از همین قضیه ی event viewer هست .



    خوب این که سخت نیست .
    همونطور که گفته شد ، کلاس
    EventLogWatcher برای این کار هست .
    برای استفاده از این کلاس ، مشکل یا سئوالی دارین؟
    بسیار ساده هست . کدی که در پست قبلی دادم را نگاه کنید . جای سختی چندان نداره .
    سلام وقت بخیر
    ببخشید بابت تاخییر طولانی خیلی درگیر پروژه بودیم و سفر کاری
    ممنون از راهنماییتون باید بگم بله تقریبا همین داستان شما شد و یجورایی ترکیبی کار شد البته من وسط ماجرا مدیرپروژه به کار دیگه شدم ولی تا اونجایی که اطلاع دارم کلاینتها از همین روش استفاده میکنن و سرور هر کلاینت یه پورت خاص رو رو کلایت دائما چک میکنه و بقیه ماجرا
    مرسی از شما و همه دوستانی که دو این مدت بنده رو راهنمایی کردن از همه بحثای و پیشنهادات اینجا نهایت استفاده رو شد و من از طرف خودم وبقیه همکارام وقعا سپاسگذارم چون کار نهایی یه ترکیبی بود از همه پیشنهادات
    سپاس

  29. #29
    کاربر جدید آواتار hotcat
    تاریخ عضویت
    مهر 1391
    محل زندگی
    Iran
    پست
    27

    نقل قول: مطلع شدن همه فرمهای برنامه از یک رویداد سیستمی

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    ببینید دوست عزیز، همونطور که دوستان گفتن شما نیاز به سوکت پروگرمینگ دارین نه مطلع شدن از قطعی اینترنت کلاینت، من کد چک کردن وضعیت اتصال اینترنت رو دارم ولی توی سناریوی شما اصلا به درد نمیخوره، فرضا کاربر یه سری داده از سرور گرفته و داره روشون کار انجام میده که یهو اینترنت اون کلاینت قطع میشه، خب الان وقتی این کلاینت قطعه و هیچ دسترسی ای به اینترنت نداره چجوری میخواد به سرور اطلاع بده که نتش قطعه و نمیتونه کار محوله رو انجام بده؟؟ وضعیت قطع شدن یک کلاینت باید توسط خود سرور تشخیص داده و توی کل شبکه همه پخشی بشه، پس کلاینت با چک کردن اینترنت خودش هیچ کار مفیدی نمیکنه، اما در هر حال اگه بازم کد چک کردن وضعیت اتصال اینترنت رو خواستین بگین توی پروژه هام پیدا کنم و بذارم براتون
    سلام و ممنون از راهنماییتون
    عزیز کاربر کلاینت خودش باید از قطع بودن نت مطلع بشه که دنبال مشکل بگرده و برای حل و اینکه سرور ها هم باید اطلاع قطع بودن کلاینت مطلع باشن برای اینکه کار اونو پخش کنن بین بقیه و ضمنا گاها پیش اومده تو به زون یه کلاینت از یه سرور قطع شده ولی بقیه کلاینتهای اون زون متصل هستن و البته که خوب این سرور هست که از قطعی یه کلاینت مطلع میشه و به بقیه اطلاع میده.سوکت خیلی با لایه های پایین درگیر میشه و مدیریت بهینه سازیش با دولوپر هست. ما میخواستم هم کار ساده تر باشه هم بهینه تر که سرویسها کارو هم راحت تر کردن با قابلیتهای بیشتر و البته مدیریت راحتتر ضمن اینکه اینقدرا هم یه چک کردن پیچیده ای نیست. و تبادل اطلاعات هم با همین سرویسها داره انجام میشه ولی براساس یسری پروتوکلهای شبکه مثل مثلا UDP که حالا اونو با سوکت یه بخشهای کوچیکشو بچه ها کد زدن و تو جابجایی بین سرور هاو آپدیت کردن اونا بیشتر کارارو هم که خود ویندوز سرور و اس کیو ال انجام میدن و مدیریت میکنن.
    امیدوارم تونسته باشم درست توضیح داده باشم.
    بازم ممنون از شما

تاپیک های مشابه

  1. بهترین راه و طراحی سیستم تلفن گویا
    نوشته شده توسط مهدی رحیم زاده در بخش C#‎‎
    پاسخ: 22
    آخرین پست: پنج شنبه 07 مهر 1390, 12:26 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •