View Full Version : loop همراه با وقفه
Cave_Man
پنج شنبه 01 فروردین 1387, 13:19 عصر
فرض کنید یه حلقه While داریم و میخایم هر بار که دستورات حلقه اجرا میشه مثلا مدت زمان 3 ثانیه تا اجرای بعدی و تکرار حلقه فاصله بیفته.پیاده سازیش چطوریه؟
البته میشه از دستوراتی مثل Sleep هم استفاده کرد اما واقعا برنامه Freeze میشه و من نمیخام این اتفاق بیفته
یه راه هم هست و اون استفاده از Timer بجای حلقه هست اما میخام حتی الامکان با کد نویسی صرف این کار رو انجام بدم
کسی نظری داره؟
Cave_Man
پنج شنبه 01 فروردین 1387, 15:58 عصر
به نظرم یه کم این کار غیر منطقی میاد و ساختارهای معمول زبانهای برنامه نویسی این امکان رو فراهم نمیکنن و تنها راهش استفاده از Timer باید باشه کسی راهی جز این سراغ داره؟
babak_delphi
پنج شنبه 01 فروردین 1387, 17:01 عصر
اگه بخای خیلی دقیق باشه باید برین سراغ سخت افزار
در غیر اون صورت استفاده از تایمر یا ترکیب اون با Application.Proccessmesage (اگه املاش درست باشه) رو هم امتحان کنید.
SYNDROME
پنج شنبه 01 فروردین 1387, 21:34 عصر
می توانی از روشهایی که گفتی استفاده کنی ولی در کنار آن از Thread هم استفاده کنی تا برنامه قفل نشود.
موفق باشید
Cave_Man
جمعه 02 فروردین 1387, 01:01 صبح
اگه بخای خیلی دقیق باشه باید برین سراغ سخت افزار
در غیر اون صورت استفاده از تایمر یا ترکیب اون با Application.Proccessmesage (اگه املاش درست باشه) رو هم امتحان کنید.
lدر مورد راه حل اول که سخت افزار ... میشه بیشتر منظورتون رو بیان کنید؟
اگر بخام از تایمر استفاده کنم البته دیگه نیازی به Aplication.ProcessMessages نیست برنامه فقل نمیکنه
Cave_Man
جمعه 02 فروردین 1387, 01:06 صبح
می توانی از روشهایی که گفتی استفاده کنی ولی در کنار آن از Thread هم استفاده کنی تا برنامه قفل نشود.
موفق باشید
بیشتر توضیح بده دقیقا متوجه نشدم منظور ت چیه...
اگه از روشی که گفتم (استفاده از تایمر ) دیگه نیازی به Thread نیست چون برنامه Freeze نمیشه.
SYNDROME
جمعه 02 فروردین 1387, 07:43 صبح
یه راه هم هست و اون استفاده از Timer بجای حلقه هست اما میخام حتی الامکان با کد نویسی صرف این کار رو انجام بدم
کسی نظری داره؟
بیشتر توضیح بده دقیقا متوجه نشدم منظور ت چیه...
اگه از روشی که گفتم (استفاده از تایمر ) دیگه نیازی به Thread نیست چون برنامه Freeze نمیشه.
در پست اول گفتید می توانم با یک Timer مشکل را حل کنم ولی می خواهید تا جای ممکن از کد نویسی استفاده کنید.
اگر می خواهید از Timer استفاده کنید مشکل حل می شود ولی در صورتی که از حلقه استفاده کنید باید با استفاده از Thread از قفل شدن برنامه جلوگیری کنید.
موفق باشید
Cave_Man
جمعه 02 فروردین 1387, 10:03 صبح
در پست اول گفتید می توانم با یک Timer مشکل را حل کنم ولی می خواهید تا جای ممکن از کد نویسی استفاده کنید.
اگر می خواهید از Timer استفاده کنید مشکل حل می شود ولی در صورتی که از حلقه استفاده کنید باید با استفاده از Thread از قفل شدن برنامه جلوگیری کنید.
موفق باشید
دوست عزیز ممنون به خاطر جوابتون
ببینید فرض کنید من از Thread استفاده کنم و حلقه در این صورت مجبور هستم کل حلقه رو بزارم توی یه Thread یا اینکه دستورات درون حلقه رو در چند Thread قرار بدم.عجیبه این راه درست نیست . من معتقدم به نتیجه نمیرسه چون اگر من کل While رو در یک نخ قرار بدم عملا فرقی نمیکنه با اینکه اون رو در نخ نزارم یا اگه هر دستور درون حلقه رو در یک نخ جدا بزارم اونوقت این نخها چطوری باید اجرا بشن؟ با هم دیگه؟ پشت سر هم دیگه ؟ در این صورت زمانی که قراره بین دستورات یه وقفه زمانی ایجاد بشه چطوری میشه؟
فرض کنید دستورات من اینی باشه که اینجا قرا میدم روی این قطعه کد توضیح بدید فکر میکنم اینطوری خیلی واضح تر باشه.
while not ADO.Eof do
begin
ShowBalloonHint(ADO.fieldbyname('subject').AsStrin g,ADO.fieldbyname('location').AsString + #13 +ADO.fieldbyname('comment').AsString,bitInfo, 10);
sleep(4000);
ADO.Next;
end;
این قطعه کد کارش اینه که پیغامهایی رو در زمان مشخصی نشون بده
فرض کنید 3 تا پیغام بخاد بشون داده بشه و بین هر ارائه پیغام یک زمان 4 ثانیه ای باید وجود داشته باشه.اون وقفه رو میخام ایجاد کنم بدون اینکه برنامه دچار Freeze شدن بشه.
تابع ShowBalloonHint پیغام رو نمایش میده پیغام از نوع Balloon هایی هست که در TrayIcon نمایان میشن یعنی ShowModal نیستن.میتونیم بجای Balloon پیغام رو در یک پنل Panel در نظر بگیریم.
babak_delphi
جمعه 02 فروردین 1387, 14:21 عصر
یک تایمر روی فرم بگذارید
موس رو ببرید روی نوار بالای فرم و دکمه چپ رو پایین نگه دارین
ببینین تایمر درست کار میکنه؟؟؟
تایمر زیاد قابل اطمینان نیست
البته برای کارهایی که به دقت خیلی زیاد نیاز ندارند مشکل خاصّی نداره
برای کارهای دقیق از سخت افزار (کریستال) استفاده کنید
در غیر این صورت (که فکر کنم همین مورد دوم نیاز شما رو رفع کنه) Thread روش خوبیه
چون برنامه هم Freeze نمیشه ، ضمنا میتونین هم زمان بقیه کارها رو در برنامه انجام بدین.
Cave_Man
جمعه 02 فروردین 1387, 16:23 عصر
دوست عزیز ممنون
چرا تایمر مطمئن نیست؟ تایمر دقتش در حد میلی ثانیه هست. شما مشکل خاصی قبلا باهاش داشتید؟
در مورد سخت افزار و نحوه استفاده از این روش و اگر این کار با استفاده از کلاس خاصی انجام میشه لطفا توضیح بیشتری بدید.
Mahmood_M
شنبه 03 فروردین 1387, 02:10 صبح
چرا تایمر مطمئن نیست؟ تایمر دقتش در حد میلی ثانیه هست. شما مشکل خاصی قبلا باهاش داشتید؟
منظور دوستمون این هست که وقتی فرم دراگ میشه ، دستورات درون فرم متوقف می شن و تایمر هم برای اون مدت از کار می افته ...
برای حل مشکلتون می تونید از تابع Sleep در یک Thread استفاده کنید یا مثلا از یک حلقه for با مقدار زیاد ...
یعنی اینکه برای توقف حلقه مورد نظر در ابتدای اون یک حلقه طولانی قرار دهید ، البته این حلقه ها هم مثل تایمر در هنگام دراگ فرم متوقف خواهند شد ( فرم هم در این زمان بسته نمی شه ! ) ، مگر اینکه در یک Thread جدا قرار داشته باشن ...
به این کد دقت کنید :
while M < 10 do
begin
for I := 1 to 20000000 do
begin
N := I;
Application.ProcessMessages;
end;
M := M + 1;
end;
اینم یه برنامه نمونه که میتونید از لینک زیر دانلود کنید :
http://nabegheh.parsaspace.com/Examples/Delay.rar
البته این روش در برنامه های بزرگ اصلا منطقی به نظر نمی یاد ...
موفق باشید ...
SYNDROME
شنبه 03 فروردین 1387, 08:33 صبح
من دستورات زیر را در یک Threadنوشتم.
procedure Test.Execute;
Var
i , j : Integer;
begin
Try
for i := 1 to 100000 do
for j := 1 to 100000 do
Begin
if Terminated then Break;
Form_Main.Caption := IntToStr(i*j);
End;
Except
End;
{ Place thread code here }
end;
و سپس به دستورات زیر Thread را اجرا کردم.
A := Test.Create(True);
a.FreeOnTerminate := True;
a.Resume;
زمانی که شما از Thread استفاده می کنید می توانید کارها را موازی هم انجام دهید و از قفل شدن برنامه جلوگیری کنید.
موفق باشید
Cave_Man
شنبه 03 فروردین 1387, 17:12 عصر
به هر حال همون یکی دو روز پیش مجبور شدم از تایمر استفاده کنم تا کارم راه بیفته
وخوب هم کارمیکنه
Syndrome جان بله با نخ این مشکل قابل حل هست یعنی میشه اون وقفه و حالت قفل شدن برنامه رو توی یه نخ برد و از قفل شدن برنامه جلوگیری کرد یعنی Thread ما Freeze میشه ولی Thread اصلی که همون برنامه باشه دیگه Freeze نخواهد شد.
Cave_Man
شنبه 03 فروردین 1387, 17:14 عصر
منظور دوستمون این هست که وقتی فرم دراگ میشه ، دستورات درون فرم متوقف می شن و تایمر هم برای اون مدت از کار می افته ...
برای حل مشکلتون می تونید از تابع Sleep در یک Thread استفاده کنید یا مثلا از یک حلقه for با مقدار زیاد ...
امتحان کردم و خوشبختانه این اتفاق نمیفته و تایمر کار خودش رو انجام میده
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.