PDA

View Full Version : چرا این کد هنگ میکنه؟



group45
شنبه 14 فروردین 1389, 09:56 صبح
با سلام
یه برنامه نوشتم که زمان سیستم رو هر 1 ثانیه توی یه فیل متنی ذخیره میکنه.حالا دکمه رو که میزنم شروع به کار میکنه ولی تا حلقه وایل تموم نشه دکمه رو آزاد نمی کنه که شرط خروج از حلقش فعال شه.
یه نگاهی به این کدا بندازید و راهی واسه هنگ نکردن برنامه بگید.

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




public bool stop = false;

public void cf(string Path)
{
//creat folder

if (!System.IO.Directory.Exists(Path))
System.IO.Directory.CreateDirectory(Path);
}

public void ct(string a, string b, string c, string d, string e)
{
button1.Text = "Stop Recording";

//creat text

a += '-' + b + '-' + c + '-' + d + e;
System.IO.StreamWriter writer = File.AppendText(a);
while (!stop)
{
writer.WriteLine(System.DateTime.Now.TimeOfDay);
System.Threading.Thread.Sleep(1000);
}
writer.Close();
stop = true;
}

private void Form1_Load(object sender, EventArgs e)
{
maskedTextBox1.Text = System.DateTime.Now.TimeOfDay.ToString();
}

private void button1_Click(object sender, EventArgs e)
{
if (!stop)
{
cf(@"c:\Time Recorder45");
ct(@"c:\Time Recorder45\Record", System.DateTime.Now.Hour.ToString(), System.DateTime.Now.Minute.ToString(), System.DateTime.Now.Second.ToString(), ".txt");
}
else
{
stop = true;
button1.Text = "START RECORDING";
}

}

ASKaffash
شنبه 14 فروردین 1389, 10:10 صبح
سلام
این حلقه CPU را درگیر می کند:


while (!stop)
{
writer.WriteLine(System.DateTime.Now.TimeOfDay);
System.Threading.Thread.Sleep(1000);
}

Aferir
شنبه 14 فروردین 1389, 10:56 صبح
برای کار مورد نظر شما بهترین روش استفاده از System.Timers.Timer است

group45
شنبه 14 فروردین 1389, 12:20 عصر
ممنون میشم اگه با مثال منو روشن کنید :متفکر:

با تشک فراوان :چشمک:

happy65_sh
شنبه 14 فروردین 1389, 13:22 عصر
سلام
يه تايمر بذار روي فرمت .در ايونت Tick تايمرت عمليات ذخيره در فايل را انجام بده .اگر دوست داري اين عمليات هر ثانيه تكرار بشه interval تايمرت را روي 100 تنظيم كن يك باتن هم بذار و هر وقت خواستي تايمرت را stop كن،اگر هم دوست داري با load فرمت عمليات آغاز بشه ،توي لود فرم تايمرت را start كن وگرنه يك باتن براي استارت تايمرت بذار

ASKaffash
شنبه 14 فروردین 1389, 13:54 عصر
سلام
دو روش برای این مسئله وجود دارد :
- روش علمی استفاده از thread
- روش کار راه بنداز متد DoEvents

group45
شنبه 14 فروردین 1389, 22:15 عصر
سلام اگه امکانش هست لطف کنید کداشو بزارین ممنون میشم

آخه به اینجور کارها تو سی شارپ زیاد وارد نیستم :خجالت:

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

group45
یک شنبه 15 فروردین 1389, 09:22 صبح
یعنی کسی نیست یه مثال بزنه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

losingsleeep
یک شنبه 15 فروردین 1389, 09:58 صبح
از toolbox/components یک ابزار timer بنداز روی فرم.
توی properties این تایمر ، Enabled رو true کن و Interval رو 1000
یک رویداد هم بنام tick داره که باید هندل کنی.
حالا توی مدیر این رویداد هر چی بنویسی هر یک ثانیه یک بار اجرا میشه (بخاطر Interval که مقدارش 1000 هست)

group45
یک شنبه 15 فروردین 1389, 22:45 عصر
از toolbox/components یک ابزار timer بنداز روی فرم.
توی properties این تایمر ، Enabled رو true کن و Interval رو 1000
یک رویداد هم بنام tick داره که باید هندل کنی.
حالا توی مدیر این رویداد هر چی بنویسی هر یک ثانیه یک بار اجرا میشه (بخاطر Interval که مقدارش 1000 هست)

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

seven7777777
یک شنبه 15 فروردین 1389, 23:25 عصر
دوست عزیز اول یه Timer به فرمت اضافه کن .
بد از قسمت Properties/Events روی تنها ایونت تایمر که Tick هست ، دوبار کلیک کن .
حالا وارد صفحه کد نویسی میشی و توی تابع مربوط به این ایونت قرار می گیری .
در نهایت کد نوتن توی فیل متنی رو اضافه کن .

ASKaffash
دوشنبه 16 فروردین 1389, 11:15 صبح
سلام اگه امکانش هست لطف کنید کداشو بزارین ممنون میشم

آخه به اینجور کارها تو سی شارپ زیاد وارد نیستم :خجالت:

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

سلام
هردوروش قبلا در سایت بحث شده و نمونه گذاشته شده است(جستجو)