PDA

View Full Version : به تعویق انداختن یک عمل تا خاتمه یک عمل دیگر



delphi5
یک شنبه 25 آذر 1386, 16:06 عصر
با سلام
من از ابزار KDtele برای ارسال فکس استفاده میکنم .
مشکل اینجاست که چطور میشه زمانیکه قراره چند fax مختلف رو پشت سرهم ارسال کرد ، روال ارسال فکس را تا ارسال فکس اول به تعویق انداخت .
به عنوان مثال
1- 5 فکس داریم که هر کدام 3 تا 4 برگ ضمیمه دارند .
2-حال قرار است که از یک حلقه loop استفاده کنیم (for i:= 1 to 5 do).
3-زمانیکه در حلقه متغیر مقدار 1 را میگیرد شماره اول گرفته شده و ارسال میگردد اما در مراحل اول این عمل حلقه Loop مقدارش عوض شده و به 2 و 3 و 4 و 5 تغییر پیدا میکند و پشت سرهم 5 بار روال مربوط به ارسال فکس اجرا میشود که این عمل باعث ایجاد اختلال میگردد .


تا جائب که من Search کردم به اونجا رسیدم که باید از Event استفاده کنم . حال Event چیست و چگونه میشود از آن استفاده کرد رو نمیدونم .
از ورژن Delphi 5 استفاده میکنم .


کسی پیشنهاد یا راه حلی داره . ؟
مرسی

ali_mohamadi8928
یک شنبه 25 آذر 1386, 16:37 عصر
منم یه همچین مشکلی دارم ولی نه به این شکل .

مثلا میخوام بین فرمان ها بر اساس یک باجه ی زمانی که تعیین میکنم فاصله به وجود بیاد .


فرمان اول
فرمانی که باعث شود فرمان دوم 10 ثانیه بعد از فرمان اول اجرا شومد
فرمان دوم
فرمانی که باعث شود فرمان سوم 10 ثانیه بعد از فرمان دوم اجرا شومد
فرمان سوم

با چه فرمانی میشه این کار رو کرد ؟؟

فرک کنم دوستمون با پاسخ این سوال به جوابش برسه ؟؟ منم به جوابم میرسم !!!

با تشکر .

mrm0101
یک شنبه 25 آذر 1386, 17:27 عصر
سلام
با اجازه اساتید
شما می توانید از Thread ها استفاده کنید . توی کامپونت JCL+JVCL210FullInstall کنترلی بنام JvThread وجود دارد

Thread ها برای مدیریت اجرای دو دستور بدون تداخل بکار می روند . مثلا شما می خواهید حین جستجو در بانک اطلاعاتی یک انیمیشین که معرف جستجو است را نمایش بدهید و به محض پایان جستجو انیمیشن هم خود به خود بسته شود

یا مثال دوستمون می خواهیم 5 فاکس ارسال کنیم که به محض پایان اولی بصورت کامل دومی شروع شود و الی اخر



نحوه کار کردن این شی
شی JvThread دارای سه event است

onbegin
onExecute
onFinish

برای شروع فرمان این شی از دستور JvThread.Exclusive استفاده می کنیم


حال ما می خواهیم یک دستور را اجرا کنیم مثلا ارسال 5 فاکس .
پنج تا از اشیاء JvThread را روی فرم می گذاریم . و یک Button

در event کلیک روی Button دستور اجرای اولین Thread را می نویسیم
JvThread1.Exclusive

در onExecute اولی دستور ارسال فاکس 1 را می نویسیم .

در onFinish اولی دستور JvThread2.Exclusive دوم را می نویسیم والی شی پنجم که حاوی ارسال فاکس پنجم است . یعنی یک رابطه بازگشتی

البته شاید اساتید نظرات بهتری را داشته باشند
موفق باشید

Cave_Man
یک شنبه 25 آذر 1386, 17:35 عصر
مثلا میخوام بین فرمان ها بر اساس یک باجه ی زمانی که تعیین میکنم فاصله به وجود بیاد .



Sleep(2000);

A.Nemati
یک شنبه 25 آذر 1386, 17:42 عصر
فکر کنم مشکل دوستمون Delphi5 با مشکل شما (آقای محمدی) متفاوت باشه، ایشان می‌خواهند که انجام عمل بعدی منوط به اتمام عمل اول باشد (هر چقدر که عمل اول طول بکشد)، ولی شما دقیقا یک بازه زمانی دارید.
در مورد سوال delphi5:
event به رویداد ترجمه شده و در واقع پاسخی است که انجام یک عمل داده می‌شود. به عنوان مثال وقتی شما یک دکمه را کلیک می‌کنید، یک رویداد اتفاق می‌افتد و شما می‌توانید بگویید که هنگام اتفاق افتادن رویداد، چه عملی انجام شود.
شما هنگام نوشتن برنامه‌هایی معمولی مداما با رویدادها سروکار دارید، مثلا رویداد فشردن دکمه‌ها (OnClick) که از آن به کرات استفاده کرده‌اید. وقتی هنگام طراحی، دکمه‌ای را روی فرم می‌گذارید و با دابل کلیک روی دکمه به بخش کد وارد می‌شوید تا دستورات لازم را برای آن دکمه بنویسید، در واقع رویداد OnClick را فراخوانی کرده‌اید. لیست رویدادهای هر کامپوننت در پنجره Object Inspector در تب Events قابل مشاهده است.
احتمالا کامپوننت شما (KDtele) یک رویداد برای اعلام اتمام کار ارسال فکس دارد. از آن استفاده کنید.
یک راه ساده این است که می‌توانید یک متغیر boolean (مثلا ReadyToContinue) در بخش Private تعریف کنید. هر بار در ابتدا حلقه ReadyToContinue را False کنید و ادامه کار را منوط به True شدن آن کنید. در آن رویداد، متغیر ReadyToContinue را True کنید.

اما پاسخ دوستمان، آقای محمدی:


....
var
i: Integer;
begin
... // Proccess 1
i:= 0;
repeat
Application.ProcessMessages
inc(i)
sleep(10)
until i < 1000

... // Proccess 2
i:= 0;
repeat
Application.ProcessMessages
inc(i)
sleep(10)
until i < 1000

... // Proccess 3

A.Nemati
یک شنبه 25 آذر 1386, 17:48 عصر
شما می توانید از Thread ها استفاده کنید .

تا جایی که من می‌دونم از Thread برای Proccessهای موازی استفاده می‌شه نه سریال.

ali_mohamadi8928
یک شنبه 25 آذر 1386, 18:03 عصر
سلام
با اجازه اساتید
شما می توانید از Thread ها استفاده کنید . توی کامپونت JCL+JVCL210FullInstall کنترلی بنام JvThread وجود دارد

Thread ها برای مدیریت اجرای دو دستور بدون تداخل بکار می روند . مثلا شما می خواهید حین جستجو در بانک اطلاعاتی یک انیمیشین که معرف جستجو است را نمایش بدهید و به محض پایان جستجو انیمیشن هم خود به خود بسته شود

یا مثال دوستمون می خواهیم 5 فاکس ارسال کنیم که به محض پایان اولی بصورت کامل دومی شروع شود و الی اخر



نحوه کار کردن این شی
شی JvThread دارای سه event است

onbegin
onExecute
onFinish

برای شروع فرمان این شی از دستور JvThread.Exclusive استفاده می کنیم


حال ما می خواهیم یک دستور را اجرا کنیم مثلا ارسال 5 فاکس .
پنج تا از اشیاء JvThread را روی فرم می گذاریم . و یک Button

در event کلیک روی Button دستور اجرای اولین Thread را می نویسیم
JvThread1.Exclusive

در onExecute اولی دستور ارسال فاکس 1 را می نویسیم .

در onFinish اولی دستور JvThread2.Exclusive دوم را می نویسیم والی شی پنجم که حاوی ارسال فاکس پنجم است . یعنی یک رابطه بازگشتی

البته شاید اساتید نظرات بهتری را داشته باشند
موفق باشید

سلام.

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

با تشکر .

mrm0101
دوشنبه 26 آذر 1386, 02:50 صبح
سلام
http://homepages.borland.com/jedi/jvcl/

موفق باشید

delphi5
دوشنبه 26 آذر 1386, 10:30 صبح
سلام
با اجازه اساتید
شما می توانید از Thread ها استفاده کنید . توی کامپونت JCL+JVCL210FullInstall کنترلی بنام JvThread وجود دارد

Thread ها برای مدیریت اجرای دو دستور بدون تداخل بکار می روند . مثلا شما می خواهید حین جستجو در بانک اطلاعاتی یک انیمیشین که معرف جستجو است را نمایش بدهید و به محض پایان جستجو انیمیشن هم خود به خود بسته شود

یا مثال دوستمون می خواهیم 5 فاکس ارسال کنیم که به محض پایان اولی بصورت کامل دومی شروع شود و الی اخر



نحوه کار کردن این شی
شی JvThread دارای سه event است

onbegin
onExecute
onFinish

برای شروع فرمان این شی از دستور JvThread.Exclusive استفاده می کنیم


حال ما می خواهیم یک دستور را اجرا کنیم مثلا ارسال 5 فاکس .
پنج تا از اشیاء JvThread را روی فرم می گذاریم . و یک Button

در event کلیک روی Button دستور اجرای اولین Thread را می نویسیم
JvThread1.Exclusive

در onExecute اولی دستور ارسال فاکس 1 را می نویسیم .

در onFinish اولی دستور JvThread2.Exclusive دوم را می نویسیم والی شی پنجم که حاوی ارسال فاکس پنجم است . یعنی یک رابطه بازگشتی

البته شاید اساتید نظرات بهتری را داشته باشند
موفق باشید

دوست عزیز اما من تعداد فکسهایم متغیر هستند و نمی دونم چند تا از این کامپوننت استفاده کنم

ghabil
دوشنبه 26 آذر 1386, 10:46 صبح
ببین من تا حالا با KDTele کار نکردم ، اما روش درست همون استفاده از Messaging که خودت گفتی هست ، روش کار هم اینطوریه که تو وقتی دستوری رو به ماشین میدی (به یک Device جانبی مثل فکس) ماشین وقتی کارش تموم شد یک Event Asynchron بر میگردونه که کارم تموم شد ، یا Stateش عوض میشه. حالا اینکه KDTele چطور این ایونت رو برمیگردونه من نمیدونم ولی باید دنبال این باشی نهایتا هم در مورد عوض شدن State کدت یک چیزی اینطوری میشه مثلا :



for i:= 1 to 5 do
begin
FaxComponent.SendFax(i);
while(FaxComponent.State <> stSend) do; //این یعنی تا وقتی استیت عوض نشده به سند صبر کن اینجا
end;



در مورد Event Async هم باید Event پوینتر رو به پارامتر ارسال فکس بفرستی تا وقتی کار تموم شد اجراش کنه.

delphi5
دوشنبه 26 آذر 1386, 15:19 عصر
while(FaxComponent.State <> stSend) do; //این یعنی تا وقتی استیت عوض نشده به سند صبر کن اینجا

یعنی این دستور اجرای برنامه را تا خاتمه ارسال فکس متوقف میکنه ؟

ghabil
دوشنبه 26 آذر 1386, 22:31 عصر
این دستور تا وقتی که State با stSend برابر نباشه همینجا وای میسته ! البته حالا این نمونه بود قشنگترش یک چیزی مثل اینه (به شرطی که مثلا استیت Sending داشته باشه) :



while state = sending do;
if State= Sent showMessage('Sent');
if state = Error then showMessage('Error');


این قشنگتر و درست تره.

vcldeveloper
سه شنبه 27 آذر 1386, 02:21 صبح
KDTele برای کامپوننت KDFax یک رویداد داره به اسم OnFaxState که وضعیت Fax در هر لحظه بوسیله آن گزارش میشه. کافی کاری که آقای Ghabil گفتند را در این رویداد انجام بدید و چک کنید کی مقدار پارامتر FaxState برابر fsFaxDone میشه. این چیزها کاملا در Help این کامپوننت تشریح شده و براشون Demo کاملا گویا هم وجود داره.

delphi5
چهارشنبه 28 آذر 1386, 17:24 عصر
KDTele برای کامپوننت KDFax یک رویداد داره به اسم OnFaxState که وضعیت Fax در هر لحظه بوسیله آن گزارش میشه. کافی کاری که آقای Ghabil گفتند را در این رویداد انجام بدید و چک کنید کی مقدار پارامتر FaxState برابر fsFaxDone میشه. این چیزها کاملا در Help این کامپوننت تشریح شده و براشون Demo کاملا گویا هم وجود داره.


جناب کشاورز
اما چطور باید این کار رو توی یک حلقه استفاده کنم . من تست کردم اما نشد .برنامه رو ارسال کردم شاید بتونید منو راهنمائی کنید .این برنامه با دلفی 5 نوشته شده است .ممنون میشم اگه منو راهنمائی کنید .

vcldeveloper
چهارشنبه 28 آذر 1386, 19:42 عصر
توی حلقه نمی خواد استفاده کنید. توی همون رویداد مقدار مورد نظر را چک کنید، مثلا:


procedure TForm1.KDFax1FaxState(Sender: TObject; FaxState: TFaxState;
Param1: Integer; StrParam2: String);
begin
case FaxState of
fsFaxDone : //Start new fax
end;
end;

M.Ehsanifar
پنج شنبه 29 آذر 1386, 01:10 صبح
ببخشید که وسط سوا این دوستمون سوال خودمو مطرح می کنم . آخه سوالمن ربط داره به این موضوع .
برای درست کردن یک massagebox بوسیله فرم (بصورت دلخواه) هم می شه از این تاخیری که آقای ghabil نوشتن استفاده کرد ؟ یه تاخیر بصورت استفاده از حلقه while . یا اینکه راه دیگه ای وجود داره .

به عبارت دیگه یک رویه ای که تا ok نشده بقیه برنامه اجرا نشه . مثل showmessage .

vcldeveloper
پنج شنبه 29 آذر 1386, 02:57 صبح
برای درست کردن یک massagebox بوسیله فرم (بصورت دلخواه) هم می شه از این تاخیری که آقای ghabil نوشتن استفاده کرد ؟
وقتی فرمی که برای نمایش پیغام استفاده می کنید بصورت ShowModal فراخوانی بشه، اجرای برنامه تا زمان بسته شدن فرم مربوطه متوقف میشه.

delphi5
پنج شنبه 29 آذر 1386, 14:53 عصر
آقای کشاورز . اگه ممکنه منو راهنمائی کنید

vcldeveloper
پنج شنبه 29 آذر 1386, 18:16 عصر
شیوه کار خیلی مشخص هست. شما رویداد OnFaxState دارید که براش کد هم نوشتید. هر زمان کار ارسال فکس تمام بشه، این رویداد مقدار fsFaxDone را در FaxState برمی گردونه. شما با استفاده از Case مقدارهای مختلفی را که FaxState بر می گردونه چک می کنید و هر زمان که مقدارش fsFaxDone بود، به KDFax میگید که فکس بعدی را بفرسته. یعنی همون کدی را که به عنوان "مشکل" مطرح کردید را باید با کمی تغییرات (مثلا نیازی به حلقه نیست، چون fsFaxDone برگشت داده نمیشه، مگر زمانی که ارسال فکس تمام شده باشه) در رویداد OnFaxState در بخش مربوط به fsFaxDone بنویسید.

delphi5
یک شنبه 02 دی 1386, 08:07 صبح
یعنی می فرمائید هیچ نیازی به حلقه نیست
من متوجه نمی شم :(

vcldeveloper
دوشنبه 03 دی 1386, 03:18 صبح
یعنی می فرمائید هیچ نیازی به حلقه نیست
خیر!!!! شما توی کد بالا حلقه می بینید؟!!
هر وقت ارسال فکس تموم بشه، مقدار fsFaxDone به رویداد OnFaxState ارسال میشه و شما می تونید فکس بعدی خودتون رو بفرستید.

delphi5
پنج شنبه 06 دی 1386, 13:45 عصر
جناب کشاورز شما صحیح میگفتید .
اما مشکل اینجاست که نقطه شروع کجاست ؟
من قراره که یه شرط بگذارم . اگه اون شرط درست بود اون کار شروع بشه . یعنی مشکل روی فکس اول است .
مشکل دوم اینه که بعد از ارسال آخرین فکس چطور باید دوباره این روال آغاز بشه ؟

vcldeveloper
پنج شنبه 06 دی 1386, 16:07 عصر
من قراره که یه شرط بگذارم . اگه اون شرط درست بود اون کار شروع بشه . یعنی مشکل روی فکس اول است .
مشکل دوم اینه که بعد از ارسال آخرین فکس چطور باید دوباره این روال آغاز بشه ؟
توسط یک روال خارج از کد مربوط به اون رویداد، مثلا با کلیک بر روی یک دکمه، کد مربوط به ارسال اولین فکس را بنویسید. برای فکس های بعدی، از همون رویداد که قبلا توضیح داده شد استفاده کنید. برای شروع مجدد کار هم از همون کدی که برای فکس اول نوشتید استفاده کنید.