PDA

View Full Version : انجام عملی چند ثانیه بعد از یک Event



Sal_64
یک شنبه 28 مهر 1387, 12:27 عصر
سلام

کلملت Thread و Timer ردر سایت جستجو کردم :کف:

در مورد Thread توضیحاتی وجود داشت که برای مواردی استفاده میشه که قراره یک کار هر چند لحظه یکبار انجام شه

اما من احتیاج دارم که با فراخوانی رویدادی(مثلا KeuDown) و تقریبا چند لحظه بعد(مثلا 5 ثانیه) کاری انجام شه (تهی کردن یک رشته) و تا گذشت 5 ثانیه اگه دوباره همون رویداد فراخوانی شده

محلش نذاره تا 5 ثانیه تموم شه و اگه بعد از اون دوباره اون رویداد انجام شد ، کارش رو انجام بده



با تشکر

SMRAH1
یک شنبه 28 مهر 1387, 14:58 عصر
سلام

1) در کامپیوتر ،5 ثانیه یک عمره نه چند لحظه
2) باید یک Threat راه بندازی که داخل یک حلقه است.در ابتدای حلقه رویداد KeyDown رو می گیره (به خصوصیت این رویداد متد مد نظرت رو =+ کن) و در انتهای حلقه هم اون رو رها می کنه (=-) و پس از رها شدن ،به مدت 5 ثانیه به خواب می ره ((sleep(5000) در بین این مدت که متد رو گرفته هم می تونی THread رو به حالت Wait ببری.

موفق باشی

Sal_64
دوشنبه 29 مهر 1387, 11:08 صبح
سلام

:لبخند:

تشکر
یه سوال دیگه من نمی خوام که رویداد هم بخوابه :چشمک: ، کارش دارم می خوام Keydown هر لحظه که خواستم در دسترس باشه، آیا با این کار KeyDown هم 5 ثانیه از کار می افته ؟

و مورد بعد میشه برای

باید یک Threat راه بندازی که داخل یک حلقه است.در ابتدای حلقه رویداد KeyDown رو می گیره (به خصوصیت این رویداد متد مد نظرت رو =+ کن) و در انتهای حلقه هم اون رو رها می کنه (=-) و پس از رها شدن ،به مدت 5 ثانیه به خواب می ره ((sleep(5000) در بین این مدت که متد رو گرفته هم می تونی THread رو به حالت Wait ببرییه مثال بزنید :خجالت:


با تشکر

SMRAH1
دوشنبه 29 مهر 1387, 11:18 صبح
تا وقتی که KeyDown اتفاق نفتاده باید به حالت Wait بره یعنی اگر لازم بود ویندوز خودش Thread رو راه اندازی می کنه.
اما بعد از گرفتن KeyDawn باید توی Sleep بره که کلا ویندوز کاریش نداره.در ضمن باید هندل رویداد KeyDown(همون=+ و =-) را از دست داده باشید.

Sal_64
دوشنبه 29 مهر 1387, 12:00 عصر
سلام
:کف: سخت تر شد

میشه تو چند خط کدی رو که منظورتونه پیاده سازی کنید :خجالت:


با تشکر

SMRAH1
دوشنبه 29 مهر 1387, 20:31 عصر
سلام

وقتی دست به کار شدم،نمی دونستم به این راحتی میشه.
در هر حال من روی فرم بدون کنترل این کار رو کردم،اگر کنترلی روی فرم دارید حتما KeyPreview رو True کنید.

موفق باشید

Sal_64
دوشنبه 29 مهر 1387, 21:47 عصر
سلام

یه دنیا تشکر

آقا اون برنامه datagridview_rofilter که خاطرت هست :عصبانی++:
لینک
http://barnamenevis.org/forum/showthread.php?t=126260
خواستم این کد رو به اون اضافه کنم یک شلم شوربایی شد :گیج:

اول لطف می کنید در مورد کلاسی که به برنامه اضافه کردید توضیح مختصری بدید :بوس:


class GetKey
{
private Form1 mainForm = null;

public GetKey(Form1 f)
{
mainForm = f;
}

public void Run()
{
Console.WriteLine("Sleeping ...");
Thread.Sleep(5000);
mainForm.KeyDown += new System.Windows.Forms.KeyEventHandler(mainForm.Form 1_KeyDown);
Console.WriteLine(" End Sleeping");
Console.WriteLine("Wait Key");
}
}و مورد بعد چطور میشه این کد رو به برنامه datagridview_rofilter با وجود override کردن ایونت Keydown و باقی قضایا اضافه کرد :خجالت:


البته اگه میدونستم تو این سوال هم دوباره لطف شما شامل حالم میشه از اول این رو مطرح می کردم :لبخند:

با تشکر فراوان

SMRAH1
دوشنبه 29 مهر 1387, 22:16 عصر
به نظرم کد به اندازه کافی گویاست.در رویداد KeyDown فرم،پس از فشردن کلید،این رویداد خود را از دریافت پیغامها محروم می کند و در مقابل یک شی GetKey را رد یک Thread جداگانه راه اندازی می کند.این شی ابتدا 5 ثانیه صبر کرده و در نهایت دوباره رویداد KeyDown فرم را تنظیم می کند.همین!

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

موفق باشید

Sal_64
چهارشنبه 01 آبان 1387, 17:00 عصر
سلام

لطفا این کد رو ببینید
البته پر از ایرور :لبخند:


با تشکر

SMRAH1
چهارشنبه 01 آبان 1387, 19:44 عصر
سلام

اين همان کد قبل است(بدون هيچ تغيير يا لااقل با تغييري که من متوجه نشدم).لطفا کد تلفيق شده رو بگذاريد تا من هم بتوانم راهنمايي تون کنم.اصلا اين فرايند عدم دريافت کليد رو براي فرمتونم مي خواهيد يا DataGrid و .... هدف چيست و ....؟

موفق باشيد

Sal_64
چهارشنبه 01 آبان 1387, 21:40 عصر
سلام

توضیحات : همون دیتاگرید قبل که سر رویداد KeyDown اون بلاها آورده شد:لبخند:

حالا با ورود عدد مورد نظر موقعیت به ردیف موزد نظر هدایت میشه و با زدن Back میشه تک تک اعداد رو پاک کرد و به تبعه اون ردیف انتخاب شده تغییر کنه
حالا توی همون برنامه قرار که اگه کاربر یه مقدار رو وارد کرد و به موقعیت مورد نظر هدایت شد چند ثانیه بعد بخواد عدد دیگه ای وارد کنه دیگه احتیاج نباشه کلید Back رو هوار بار بزنه ، و خود برنامه بیاد این کار رو برا کاربر انجام بده ... هههه ه :گیج:
کل ماجرا اینه

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


با تشکر

SMRAH1
چهارشنبه 01 آبان 1387, 21:54 عصر
کدوم یکی رو ببینم؟
درضمن متوجه نشدم!!!!؟

Sal_64
چهارشنبه 01 آبان 1387, 23:31 عصر
سلام



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


خب حالا اگه کاربر بخواد مقدار عددی جدیدی رو در ستون مورد نظر جستجو کنه باید
عدد وارد شده قبل رو پاک کنه (ذخیره شده در یک متغییر رشته ای که به عنوان پارامتر به تابع انجام جستجو فرستاده میشه)
برای اینکه احتیاج نباشه که خود کاربر این کار رو انجام بده

قصد دارم داخل خود برنامه و بعد از 5 ثانیه از وارد کردن اولین رقم ، اون متغییر رشته ای ریست شه


امیدوارم توضیحات کامل باشه

در ضمن هنوز سایت اجازه ضمیمه کردن فایل رو نمیده
در اولین فرصت اون رو میزارم

با تشکر

SMRAH1
پنج شنبه 02 آبان 1387, 09:12 صبح
سلام

1) متاسفانه آن چیزی که در این تاپیک اعلام کرده ای با هدفتان متفاوت است.
2) برنامه مورد نظرتون رو پیاده سازی کردم (البته فقط همان که رشته را بعد از چند لحظه reset کند).زمان را 2 ثانیه گرفتم و خطوطی که دقیقا مورد نظر است (و برای این منظور پیاده سازی شده است) را با BreakPoint مشخص کرده ام.این مطلب خیلی ساده تر از آنی که فکرش را می کردید امکا نپذیر بود.

موفق باشید