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

نام تاپیک: فریز شدن برنامه بعد از import کردن 20 هزار تا رکورد

  1. #1

    فریز شدن برنامه بعد از import کردن 20 هزار تا رکورد

    داستان کلی!
    سلام - من 1دونه مپ + 2 تا چارت ( هر کدوم حاوی 1 دونه series ) + یک چارت ( حاوی 13تا series ) + یه سری Label داریم.
    حالا میخوام داده هامو به صورت آنلاین ( دستگاه به pc وصله ) و یا آفلاین ( فایل رکورد رو دارم ) نمایش بدم که خب
    در حالت آفلاین ( خوندن 20 هزار تا رکورد از فایل و اضافه کردن به مپ و چارت ها - هر رکورد هم حدود 25 تا داده مختلف داره! ) که خب مشکل فریز شدن دارم. ( یعنی تا زمانی که عملیات به پایان نرسه - برنامه فریز میشه )
    در حالت آنلاین : داده به چارت و مپ اضافه میشه ولی از یه تعداد رکورد به بعد ( 400 تا مثلا ) برنامه کم کم سرعتش کم میشه و بعضی قسمتا ( label ها ) که برا بحث مانیتورینگ هستند دیگه مقدارشون رفرش نمیشه، خود چارت هم هر بار که داده بهش اضافه میشه یه لحظه وقفه میخوره و بعد بقیه داده ها اضافه میشه بهش، از یه تعداد رکورد به بعد که کلا حالت هنگی ایجاد میشه تو برنامه.

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

    مشکل فعلی من

    برا حالت آفلاین من توقع دارم وقتی فایل رکورد رو import کردم تو نرم افزار، چارت ها و مپ ابتدا کلیر بشن، بعد دونه دونه داده ها که به چارت و مپ اضافه میشن رو بتونم ببینم و بین صفحات مختلف برنامه جابجا بشم و حتی برنامه رو minimise کنم!!! یا رو صفحه نمایش برنامه رو جابجا کنم!! ---> ولی در عمل برنامه فریز میشه و حدود 30-60 ثانیه باید صب کنم تا فریز تموم بشه و اطلاعات به مپ و چارت ها اضافه بشه. ( در طول این مدت برنامه فریز هستش )

    من حتی از BackgroundWorker هم استفاده کردم ولی مشکل حل نشد ( باز همون مشکل رو داشتم )، حالا نمیدونم من اشتباه استفاده میکردم از BackgroundWorker یا باید روش دیگه ای رو پیش بگیرم.

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

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

    روشهایی که به ذهنم میرسه

    الان روش درست چیه؟ موارد زیر به ذهنم میرسه - نمیدونم روش درستی هستند نیستند، بهترین روشن - بدترین روشن... نمیدونم جدا.
    1) خوندن رکورد از فایل text و ذخیره کردنش در دیتابیس ---> خوندن دیتابیس و اد کردن رکورد در چارت.
    1.1) خوندن تمام رکوردها از text و ذخیره کردنشون در دیتابیس، که میشه به کمک BackgroundWorker انجامش داد، یوزر هم هیچ حالت فریز(هنگ) شدنی احساس نمیکنه و بعد میایم از دیتابیس رکورد هارو میخونیم و اد میکنیم تو چارت.
    1.2) خوندن تمام رکرودها از text و ذخیره در یه متغییر از نوع DataTable ( که خب بازم این قسمت به کمک BackgroundWorker انجام میشه ) و بعد میایم متغیر فوق رو به عنوان منبع داده به چارت میدیم :
    chart.DataSource = dataTable;

    2) خوندن رکورد از فایل و اد کردن مستقیم در چارت ( کاری که من الان میکنم )
    آخرین ویرایش به وسیله md3848 : چهارشنبه 06 فروردین 1399 در 16:23 عصر


  2. #2
    کاربر دائمی آواتار taghvajou
    تاریخ عضویت
    تیر 1387
    محل زندگی
    تهران
    سن
    35
    پست
    571

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

    سلام و وقت بخیر
    ورکر بگ گراند که ثرد در بک گرانده و نمیتونه تا وقتی که کامپیلیت شده به یوای دسترسی داشته باشه.
    اگر افزودن داده به لیست یا چارت و ... رو ثرد اصلی انجام بدین، برای اینکه فرم هم رفرش بشه و نمایش داده بشه، دستور زیر رو اضافه کنین:
    Application.DoEvents()


    راستش اگه ساختار و کلاس داده ها و تصویری از خروجی که نمایش میدین رو هم به سوال اضافه کنین، شاید بهتر بشه راهنمایی کرد.

  3. #3

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

    والا با توجه به پست های دیگه من و همین پست، فک کنم تا الان بدونیم من چیکار داریم میکنم ولی خب بازم یکبار دیگه توضیح میدم :
    من میخوام یه سری رکورد رو در مپ و 3 تا چارت نمایش بدم ( 2 تا از چارت ها یک Series دارن و چارت دیگه 13 تا Series داره )، یه 10-20 تا لیبل هم دارم که توشون داده نمایش داده میشه.
    حالا برا نمایش رکورد ها در نرم افزار هم 2 حالت داریم، حالت آفلاین ( که فایل text رو میدیم به نرم افزار و ... ) و حالت آنلاین ( که داده ها رو از پورت سریال میگیریم و نمایش میدیم )

    حالت آفلاین : خب من رکوردها رو در آرایه ای ذخیره میکنم ( داده ها رو تجزیه کردم و در کلاس مربوطه ذخیره کردم، کلاس فوق رکورد رو میگیره و داده هاشو تجزیه میکنه و در متغییر های مناسب ذخیره میکنه )
    List<Records.LOC> locRecords = new List<Records.LOC>();

    الان فایل رکورد من حاوی 36k رکورد هستش که میخوام به نرم‌افزار اضافه‌اش کنم، بهترین روش برای اینکار چیه؟
    الان من رکوردها رو دونه دونه میخونم و add میکنم به نرم‌افزار که باعث هنگی شدن برنامه به مدت 1min میشه. ( در پسزمینه عملیات در حال اجرا هستش )

    حالت ایده‌آل من اینه که زمانی که یوزر فایلو add کرد، به صورت realTime ببینه که داده‌ها دارن به نرم‌افزار اضافه میشن ( مثلا اول تمام داده های چارت1 ادد بشه و بعد چارت2 نمایش داده بشه و تمام داده ها بهش اضافه بشه و بعد چارت3 و بعد مپ )
    یا اگه این مورد بالا شدنی نی، یه processBar در صفحه نمایش داده بشه و زمانی که پر شد، داده ها در تمام چارتها و مپ نمایش داده بشه. ( برنامه هم هنگ نکنه )

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



    Application.DoEvents()

    این دستور دقیقا چیکار میکنه؟ تو "حلقه اضافه کردن دونه دونه رکورد ها به نر‌م‌افزار" کدفوقو گزاشتم، احساس میکنم یکم روون تر برنامه کار کرد و برنامه هم حالت هنگی به خودش نگرفت ( چون دسترسی به قسمت های دیگه نرم افزار داشتم )



    ورکر بگ گراند که ثرد در بک گرانده و نمیتونه تا وقتی که کامپیلیت شده به یوای دسترسی داشته باشه.
    نمیشه در قسمت بروزرسانی مقدار processBar داده ها رو نشون بدیم؟ ( هر بار که processBar یک واحد مقدارش افزایش پیدا میکنه، 1 کورد در قسمت های مختلف برنامه نمایش داده بشه )

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

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

    سلام ،

    چند نکته :

    1- اگر شما به درستی از try catch ها استفاده نکنین خیلی جاها نرم افزار خطا میده ولی اصطلاحا Resume (چشم پوشی) میکنه و این باعث میشه شما متوجه خطا نیشین ولی عملیات هم به درستی انجام نشه.

    2- در خصوص ترد ها و تسک ها :

    2-1 : پیشنهاد میکنم به جای BackgroundWorker(کامپوننت) از Task(کلاس) ها استفاده کنین.
    2-2 : همونجوری که دوستمون در بالا اشاره کردند دسترسی به یک شی که ThreadSafe نیست به یک شی از ترد دیگه معمولا با خطای CrossThread روبرو میشین( که خیلی وقتا خطا هم نمیده ولی نرم افزار قاطی میکنه ، دیتاها جابجا و یا گم میشن !!!) ، بنا بر این شما با شرایطی خاص که در ادامه توضیح میدم میتونین به یک شی در ترد دیگه دسترسی داشته باشین.


    برای دسترسی به یک کامپوننت از یک ترد دیگه از این کد استفاده کنین :

    private void ThreadSafeSetLabelText(Label objLabel, string _text)
    {

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


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


    توجه کنین جاهایی که میخواین Text یک Label رو تغییر بدین باید از این کد استفاده کنین چون اگر مستقیم اینکار رو کنین برنامه قاطی میکنه.


    برای پیاده سازی Task ها هم به این صورت عمل کنین :

    new Task(() =>
    {

    // عمیلات شما .........


    ThreadSafeSetLabelText(Label1,"درصد پیشرفت عملیات");


    }).Start();


    ** اگر از Thread , Task و یا BackgroundWorker استفاده میکنین دقت کنین که هر شی و یا متغییری که شما در ترد اصلی نرم افزار تعریف کردین نباید به صورت unsafe در ترد های زیر مجموعه استفاده بشه مگر اینکه با متد ThreadSafe این کار رو انجام بدین(مثل قطعه کد بالا).

  5. #5

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

    برای دسترسی به یک کامپوننت از یک ترد دیگه از این کد استفاده کنین :
    کل برنامه من فقط یک Thread داره آخه

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

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

    وقتی از BackgroundWorker , Task , Thread استفاده میکنین دیگه 1 ترد نداره ، اشکال کار هم همینجاست که درگیر Cross Thread Data Loss/Collision شدین

  7. #7

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

    خب الان من با Thread ها اصلا کار نکردم و فقط یه کدی نوشتم که یه داده ای رو میگیرم و در جاهای مختلف نمایش میدم، الان شما میگی برا مقدار دهی لیبل ها، چارت ها و ...، باید به صورتی که گفتید عمل کنم؟
    یعنی هر کنترلی ( لیبل ها، چارت ها و ... ) رو خواستم مقدار دهی کنم، از تابع ThreadSafeSetLabelText استفاده کنم / درست متوجه شدم؟

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

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

    بله ، ببینید هر متغییر یا دیتایی که در یک ترد دیگه باشه وقتی بخواین از ترد دیگه بهش دسترسی داشته باشین باید به صورن Safe باشه.

    تمام متغییر ها و دیتاهای تعریف شده توی حوزه BackgroundWorker , Task , Thread ها جز همین قانون هستند.

    ** دقت کنین که تمام شی ها و کامپوننت ها و فرم ها ، جزء ترد اصلی هستند.

  9. #9

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

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

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

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

    درست گفتین ولی خیلی ریزه کاری داره ، اگر میخواین با همون 1 ترد کار کنین ، فوقش نرم افزار هنگ میکنه برای مدتی !!

  11. #11

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

    برا چارت ها و مپ، از تایمر استفاده کردم و فعلا مشکل حل شده انگار! ( هر 1 ثانیه یکبار، داده های انباشته شده رو اضافه میکنم به مپ و چارت ها )
    میمونه اون LABEL ها که باید در هر رکرود تغییر کنند ( مثلا اگه سرعت 30 باشه، 30 بار در ثانیه هر Label باید تغییر کنه )، اینا رو برم ببینم چیکار باید کنم ( BW / TASK و... رو تست کنم سرچ کنم ببینم چی میشه ) - البته فک کنم تایمر هم اینجا جواب باشه.
    ممنون از دوستان که وقت گزاشتن و راهنمایی کردن.

    نتیجه این پست :
    1) اگه میخواید کامپوننت ها ( لیبل، چارت، مپ و... که جزو ترید اصلی هستند ) رو سریع بروزرسانی کنید میتویند از تایمر استفاده کنید تا مثلا هر 1 ثانیه یکبار یا هر نیم ثانیه یکبار تغییرات در چارت و مپ و ... اعمال بشه ( 30 بار در ثانیه کجا، 1 بار در ثانیه کجا )
    2) اگه میخواید از ترید دیگه ای کامپوننت ها رو بروزرسانی کنید، باید به صورت امن این کارو انجام بدید که نمونه تابعشو دوستمون در بالا گزاشتند.
    3) تابع زیر رو در بالا توضیح دادم - حس توضیح مجدد ندارم، ولی هنوز موندم چطور کار میکنه و چیکار میکنه دقیقا، ولی میدونم که خب کار میکنه
    Application.DoEvents()

  12. #12

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

    نقل قول نوشته شده توسط md3848 مشاهده تاپیک
    3) تابع زیر رو در بالا توضیح دادم - حس توضیح مجدد ندارم، ولی هنوز موندم چطور کار میکنه و چیکار میکنه دقیقا، ولی میدونم که خب کار میکنه
    Application.DoEvents()
    پیام هایی که بین پنجره ها رد و بدل میشه که فرضا فلان کنترل روی فرم رو رسم مجدد کن یا مقدار فلان Text رو تغییر بده و ... توی یک صف قرار میگیره و همون نخ اصلی فرم باید این صف رو پردازش کنه. وقتی داخل یک روتین ای عملیاتی با پردازش زیادی انجام میشه که نخ رو معطل نگه میداره، دیگه امکان رسیدگی به پیام های داخل صف انتظار نیست. مثلا در روتین متن یک Label رو تغییر می دهیم، اما چون همچنان در همون روتین کارهای دیگری در حال انجام ئه، نخ فرصت نداره که به اون پیام هایی مثل رسم Label رسیدگی کنه و در نتیجه Label همچنان با ظاهری قدیمی میمونه.

    برای اینکه این اتفاق رخ نده، با DoEvents از برنامه درخواست می کنیم که هر چی پیام در صف انتظار هست رو برو بهشون رسیدگی کن. یعنی در اجرای بقیه کد تون در اونجا مکث ایجاد میشه تا فرصت رسیدگی به پیام های درصف انتظار بوجود بیاد.

  13. #13

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

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

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

  1. پاسخ: 6
    آخرین پست: سه شنبه 06 تیر 1396, 21:52 عصر
  2. پاسخ: 4
    آخرین پست: شنبه 02 آبان 1394, 11:33 صبح
  3. پاسخ: 0
    آخرین پست: دوشنبه 22 تیر 1394, 00:30 صبح
  4. پاسخ: 0
    آخرین پست: جمعه 08 شهریور 1392, 16:24 عصر
  5. مشکل در import کردن import javax.bluetooth
    نوشته شده توسط alireza323 در بخش برنامه‌نویسی جاوا
    پاسخ: 2
    آخرین پست: شنبه 11 اردیبهشت 1389, 14:09 عصر

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

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