PDA

View Full Version : getting char from standard input with time expirision



nima0102
شنبه 03 آذر 1386, 20:55 عصر
با سلام
یه تابعی برای گرفتن کاراکتر از کی بورد می خوام که اگر بعد از یه زمان مشخصی کاراکتری دریافت نکرد خط بعدی برنامه رو اجرا کنه؟؟؟
ممنون میشم اگه دوستا ن راهنمایی کنن
با تشکر

emad_67
یک شنبه 04 آذر 1386, 00:22 صبح
فکر نمیکنم همچین تابعی وجود داشته باشه برای این کار باید خودت بنویسیش. میتونی از تابع Sleep(n) که n زمان بر جسب میلی ثانیه هست برای متوقف کردن برنامه استفاده کنی. در هدر فایل windows.h هم هست.

Alireza Orumand
یک شنبه 04 آذر 1386, 14:18 عصر
سلام


فکر نمیکنم همچین تابعی وجود داشته باشه برای این کار باید خودت بنویسیش. میتونی از تابع Sleep(n) که n زمان بر جسب میلی ثانیه هست برای متوقف کردن برنامه استفاده کنی. در هدر فایل windows.h هم هست.

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


int counter = 0;
do
{
if(kbhit())
{
int ch = getch();
if(ch=="your char")
break;
}
counter++;
Sleep(1000);
}while(counter < 30);

تو این روش فرض شده شما یا یه کاراکتر دلخواه میخواهید بگیرید یا 30 ثانیه صبر کنید یه حلقه درست کردیم که آخر هر حلقه 1 ثانیه صبر میکنید و یکی هم به مقدار شمارنده اضافه میکنید. که اگر این تعداد به 30 رسید و کاربر چیزی وارد نکرد از حلقه خارج میشه.
داخل حلقه هم به کمک kbhit بررسی میکنیم که آیا کلیدی زده شده یا نه اگر زده شده بود که برنامه چک میکنه کاراکتر دلخواه شما بوده یا نه که اگر باشه به انجام حلقه پایان داده میشه.
مشکل این روش همونی هست که کار عماد داشت یعنی اگر تو اون مدت یک ثانیه که برنام در حالت sleep هست کاربر کلید رو بزنه و رها کنه وقتی برنام به شرط kbhit برسه باز هم شرط false هست و کاراکتری خونده نمیشه که برای رفع این مشکل میشه مقدار زمان رو کم تر کرد مثلا به جای اینکه 1 ثانیه صبر کنیم یک هزارم ثانیه صبر کنیم و به جای اینکه شرط پایان حلقه 30 باشه شرط رو 30000 بگذاریم.
حالا روش دوم:
میتونید از دو تا thread استفاده کنید که تو یکی فشرده شدن کلید و دیگری پایان رسیدن زمان رو چک کنید و هرکدوم که اتفاق افتاد اون یکی thread رو kill کنید و به کاری که میخواهید ادامه بدید.
موفق باشید.