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

نام تاپیک: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

  1. #1

    عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

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

    کد دکمه توقف

    private void btnStop_Click(object sender, EventArgs e)
    {
    btnStart.Enabled = true;
    btnStop.Enabled = false;
    closed = true;
    serialPort.Close();
    }


    کدهایی که باعث توقف فرایند موازی می شود

    void CloseCnt()
    {
    Monitor.Enter(LockObj);
    try
    {
    _CloseCnt();
    }
    catch { }
    closed = true;
    Monitor.Exit(LockObj);
    }

    void _CloseCnt()
    {
    while (endReapets == false && closed == false)
    {
    Monitor.Wait(LockObj);
    Application.DoEvents();
    }
    }


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

  2. #2
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    سلام

    serialPort.Close رو از داخل btnStop_Click برداشته و جای دیگری استفاده کنید (بعد از چک کردن closed == true)

    در واقع هنگام کلیک فقط باید closed = true انجام بشه و در پروسه ارسال داده ها باید بعد از چک کردن این آیتم، پورت رو ببندید و null اش کنید:

    serialPort.Close
    serialPort = null

    در ضمن حتما قبل از بستن پورت چک کنید که داده ها در حال ارسال هستند یا خیر...

    void _CloseCnt()
    {
    while (endReapets == false && closed == false)
    {
    Monitor.Wait(LockObj);
    Application.DoEvents();
    }
    serialPort.Close();
    }
    آخرین ویرایش به وسیله golbafan : یک شنبه 17 اسفند 1393 در 12:29 عصر

  3. #3

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    مرسی بابت کمک ولی الان مشکلم اینه که وقتی برنامه در حال اجراست نمیتونم روی دکمه توقف کلیک کنم یعنی عمل نمیکنه مثلا دیدید وقتی روی یه دکمه میری رنگش عوض میشه یا حاشیه دکمه رنگش عوض میشه میفهمی اگه کلیک کنی یه اتفاقی میفته الان این تغییر نمیکنه یعنی دکمه توقف هیچ عکس العملی حین اجرا نداره مثلا وقتی برنامه در حال اجراست هیچ مکثی نداره که بفهمه روی دکمه توقف کلیک شده من Application.DoEvents(); رو نوشتم تا این مکث اتفاق بیفته بفهمه ولی تاثیری نداشت راه حل چیه؟ چی رو باید چک کنم؟

  4. #4
    کاربر دائمی آواتار golbafan
    تاریخ عضویت
    اردیبهشت 1388
    محل زندگی
    در قلب دوستان
    پست
    2,018

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

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

  5. #5

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط golbafan مشاهده تاپیک
    سلام
    این یعنی برنامه شما حین ارسال هنگ میکنه
    بخاطر حلقه این اتفاق میوفته
    شما بعد از هر بار ارسال در حلقه باید به برنامه استراحت بدی
    در غیر این صورت باید کد ارسال دیتا رو در ترد بنویسی
    من یکبار ابتدای اجرای برنامه ارسال انجام می دهم و در ادامه دریافت دیتا را از طریق ترد انجام می دهم من دائما بطور موازی دیتا از پورت دریافت می کنم یه تابعی هم در کدهای اصلی دارم که چک میکنه اگر مثلا closed = true شد یعنی کار به پایان رسیده پس دیگه نیاز به دریافت دیتا نداریم و پورت را هم می بندم پس ترد به همراه این تابع در حال اجراست حالا من کجا باید تغییر بدهم تا در موقع اجرا کلیک روی دکمه توقف اجرا شود؟

  6. #6
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط elahe1393 مشاهده تاپیک
    من یکبار ابتدای اجرای برنامه ارسال انجام می دهم و در ادامه دریافت دیتا را از طریق ترد انجام می دهم من دائما بطور موازی دیتا از پورت دریافت می کنم یه تابعی هم در کدهای اصلی دارم که چک میکنه اگر مثلا closed = true شد یعنی کار به پایان رسیده پس دیگه نیاز به دریافت دیتا نداریم و پورت را هم می بندم پس ترد به همراه این تابع در حال اجراست حالا من کجا باید تغییر بدهم تا در موقع اجرا کلیک روی دکمه توقف اجرا شود؟
    سلام
    یه راه اینه که شما می‌تونی در اون thread یک static property داشته باشی که هر وقت روی دکمه‌ی Stop کلیک کردی، مقدارش رو عوض کنی و توی thread هم مرتب مقدار اون رو
    چک کنی.
    یه راه دیگه هم اینه که وقتی روی دکمه‌ی stop فشار دادی، کلاً اون thread رو ببنده.

    صبا صبوحی

  7. #7

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    یه راه اینه که شما می‌تونی در اون thread یک static property داشته باشی که هر وقت روی دکمه‌ی Stop کلیک کردی، مقدارش رو عوض کنی و توی thread هم مرتب مقدار اون رو
    چک کنی.
    یه راه دیگه هم اینه که وقتی روی دکمه‌ی stop فشار دادی، کلاً اون thread رو ببنده.

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

  8. #8
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط elahe1393 مشاهده تاپیک
    مرسی از راهنماییتون
    مشکل اینجاست که اصلا مشخص نیست برنامه کلیک روی دکمه stop رو میفهمه یا نه؟ چون برنامه بقولی میره تو حالت هنگ که هیچ عملی رو درک نمیکنه تا زمانیکه به مرحله پایان کدهای اجراییش میرسه و کار دکمه شروع به پایان میرسه چطور میتونم برنامه رو از این هنگی دربیارم که کلیک روی دکمه رو بفهمه؟
    سلام
    اگه عملیات کنترل درگاه سریال در thread جداگانه انجام بشه، نباید این حالت پیش بیاد.
    شما مطمئن هستی که thread اصلی رو به هیچ عنوان Wait نمی‌کنی؟

    صبا صبوحی

  9. #9

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    اگه عملیات کنترل درگاه سریال در thread جداگانه انجام بشه، نباید این حالت پیش بیاد.
    شما مطمئن هستی که thread اصلی رو به هیچ عنوان Wait نمی‌کنی؟

    صبا صبوحی
    سلام
    وقتی دکمه شروع برنامه کلیک میشه یه سری کد اجرا میشه، بعد تحت شرایط خاص پورت باز میشه، بعد یه دیتایی به پورت ارسال میشه، بعد thread خواندن از پورت، شروع به اجرا میکنه (این ترد وظیفه خواندن از پورت رو داره و دیتاهای رسیده رو تفکیک میکنه و روی نمودار رسم میکنه)، بعد تابع CloseCnt() فراخوانی میشه که وظیفه داره توسط یه حلقه چک کنه وقتی توی ترد خواندن به مرحله خاصی رسید و دیتای خاصی دریافت کرد که endReapets = true میشه کار رو به پایان برسونه، بعد پورت بسته میشه و فرایند کلیک بر روی دکمه شروع به پایان میرسه. برای اینکه متغیرها توی تردها به اشتراک گذاشته بشه و مشکلی حین فعالیت دو فرایند خواندن از پورت و برنامه اصلی بوجود نیاد من توی تابع CloseCnt از کد Monitor.Wait(LockObj); استفاده کردم که همون میشه توی ترد اصلی از wait استفاده کردم من از اول طراحی برنامه به مشکلات مختلف برخوردم که نهایت به این کدهای فعلی و نحوه پیاده سازی رسیدم و در حال حاضر برنامه به خوبی نیازهای منو برطرف میکنه تنها مشکلی که وجود داره همین دکمه توقف هست که برنامه زمانیکه من میخوام توقف کنه نمیکنه حالا راه حل مشکل من چیه لطفا راهنمایی کنید.

  10. #10

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

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

  11. #11
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط elahe1393 مشاهده تاپیک
    سلام
    وقتی دکمه شروع برنامه کلیک میشه یه سری کد اجرا میشه، بعد تحت شرایط خاص پورت باز میشه، بعد یه دیتایی به پورت ارسال میشه، بعد thread خواندن از پورت، شروع به اجرا میکنه (این ترد وظیفه خواندن از پورت رو داره و دیتاهای رسیده رو تفکیک میکنه و روی نمودار رسم میکنه)، بعد تابع CloseCnt() فراخوانی میشه که وظیفه داره توسط یه حلقه چک کنه وقتی توی ترد خواندن به مرحله خاصی رسید و دیتای خاصی دریافت کرد که endReapets = true میشه کار رو به پایان برسونه، بعد پورت بسته میشه و فرایند کلیک بر روی دکمه شروع به پایان میرسه. برای اینکه متغیرها توی تردها به اشتراک گذاشته بشه و مشکلی حین فعالیت دو فرایند خواندن از پورت و برنامه اصلی بوجود نیاد من توی تابع CloseCnt از کد Monitor.Wait(LockObj); استفاده کردم که همون میشه توی ترد اصلی از wait استفاده کردم من از اول طراحی برنامه به مشکلات مختلف برخوردم که نهایت به این کدهای فعلی و نحوه پیاده سازی رسیدم و در حال حاضر برنامه به خوبی نیازهای منو برطرف میکنه تنها مشکلی که وجود داره همین دکمه توقف هست که برنامه زمانیکه من میخوام توقف کنه نمیکنه حالا راه حل مشکل من چیه لطفا راهنمایی کنید.
    سلام
    شاید من اشتباه می‌کنم، اما گمان می‌کنم نباید نیازی به Lock کردن داشته باشی. مگه «ترد»ی که از درگاه می‌خونه و «ترد» اصلی برنامه تو چه چیزی
    ممکنه تداخل داشته باشن؟
    و مطلب دیگه این که برای دریافت خبر از تمام شدن یک عمل چرا از حلقه استفاده می‌کنی؟ این که خیلی فشار به CPU میاره. یه راه‌کار دیگه پیدا کن.
    اگه تو «ترد» اصلی نبود، می‌گفتم از EventWaitHandle استفاده کنی. خیلی بستگی داره که چه‌کاری می‌خوای انجام بدی.

    صبا صبوحی

  12. #12

    نقل قول: عمل نکردن کلیک بر روی دکمه هنگام اجرای برنامه

    نقل قول نوشته شده توسط SabaSabouhi مشاهده تاپیک
    سلام
    شاید من اشتباه می‌کنم، اما گمان می‌کنم نباید نیازی به Lock کردن داشته باشی. مگه «ترد»ی که از درگاه می‌خونه و «ترد» اصلی برنامه تو چه چیزی
    ممکنه تداخل داشته باشن؟
    و مطلب دیگه این که برای دریافت خبر از تمام شدن یک عمل چرا از حلقه استفاده می‌کنی؟ این که خیلی فشار به CPU میاره. یه راه‌کار دیگه پیدا کن.
    اگه تو «ترد» اصلی نبود، می‌گفتم از EventWaitHandle استفاده کنی. خیلی بستگی داره که چه‌کاری می‌خوای انجام بدی.

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

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

  1. علت خطا هنگام کلیک بر روی دکمه ها
    نوشته شده توسط salmah در بخش ASP.NET Web Forms
    پاسخ: 6
    آخرین پست: چهارشنبه 24 دی 1393, 20:12 عصر
  2. اجرای یک فایل اپلود با کلیک بر روی دکمه
    نوشته شده توسط habib_namvar در بخش jQuery
    پاسخ: 7
    آخرین پست: سه شنبه 19 فروردین 1393, 14:53 عصر
  3. این نرم افزار هنگام کلیک بر روی دکمه چه Command ای را به پورت ارسال میکند؟
    نوشته شده توسط Hamishebahar در بخش امنیت در نرم افزار و برنامه نویسی
    پاسخ: 9
    آخرین پست: سه شنبه 30 آبان 1391, 11:26 صبح
  4. کلیک روی دکمه در هنگام اجرای برنامه
    نوشته شده توسط xrezax در بخش VB.NET
    پاسخ: 5
    آخرین پست: پنج شنبه 25 آبان 1391, 23:33 عصر
  5. هنگام اجرای برنامه روی خطی که error میدهد نمی ایستد
    نوشته شده توسط Maryam_y_m در بخش VB.NET
    پاسخ: 10
    آخرین پست: دوشنبه 03 مهر 1385, 16:13 عصر

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

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