بازدید نسخه کامل شده : فرم ، تايمر ، Thread ، SQL !!
Mojgan110
08-07-2006, 08:08 PM
اوووه ! نميدونم چجوري مشكل را بگم !! خيلي يه جوريه ! :beaten:
يك فرم دارم ! كه يك تايمر داخلش گذاشتم . ( كامپوننت TTimer ) و داخل ايونت مربوط به اين تايمر ، يك دستور كوتاه و كوچك ُSQL را در فواصل زماني مثلا يك دهم ثانيه اي اجرا ميكنم.
خب ...
حالا ! يك Thread جديد هم ساخته ام و از داخل اين Thread ، اون تايمره را فعال ميكنم و دستور نمايش فرمي كه گفتم همين تايمره هم توشه را هم ميدهم .
frmWait.Timer1.Enabled:= True;
frmWait.Show;
خب ...
برنامه اصلي ، خودش بايد كه يك كوئري طولاني كه 6-7 ثانيه اجراش طول ميكشه را اجرا كنه.
قبل از اينكه اين كوئري طولانيه را شروع به اجرا كنم ، اون ترد جديده را هم اجرا ميكنم . ( كه در واقع فرم مربوطه اش را نشون بده و تايمرش هم شروع كنه به اجراي اون دستور SQL كوچيكه) . و خب حالا كوئري طولانيه را هم اجرا ميكنم و ...
ولي بدبختي اينه كه با وجود اينكه اون فرمه را نشون ميده ، ولي فرمش قفل ميكنه و تا وقتي كه اجراي اون دستور كوئري بزرگه تموم نشده باشه ، تكون نميخوره و مثلا اگر يك Labelهم روش باشه ،اون را هم نشون نميده .
با اين اوصاف ! نظري داريد ؟ :sad1:
ضمنا من درست درباره Thread اطلاع و اينا ندارم ( فكر كنم سه چهار ترم ديگه ، توي سيستم عامل درسش ميدند گويا ). اين داستانها را گفتم كه شايد مشكل در نحوه استفاده از Thread م باشه و شما نظر كارشناسيتون را بدين
balabala
08-07-2006, 08:12 PM
توی وی بی از دستوری به اسم
DoEvents
استفاده میکنیم. چون thread مرید! نداره.
شما ببین همچین دستوری میتونید پیدا کنید.... چیزی که thread رو از حالت sync به async تبدیل کنه. :خجالت:
balabala
08-07-2006, 09:40 PM
مژگان کد این آرتیکل رو ببینم:
http://bdn.borland.com/article/32756
یک قسمتیش درمورد زینک یا آسینک بودن تریده.
شما هم باید همین کار رو بکنید تا بتونید از multi-thread استفاده کنید.
:victory:
Mojgan110
08-07-2006, 10:18 PM
مخسي، البته اون نميدونم چه اصراري داشته كه از API استفاده كرده . شايد چون ActiveX بوده.
ولي توي VCL، اين قابليت ساخته شده هست ... من هم خودم ازش استفاده كرده بودم : ولي افاقه نكرد !
procedure TProgressThread.Execute;
begin
FreeOnTerminate := True;
Synchronize(ShowProgress);
end;
Mojgan110
08-09-2006, 11:02 PM
ژنرال فرود ، امشب كه تا اينجا اومدين ، اين هم جواب ميدي ؟
تنكيو !
littlerabbit
08-10-2006, 01:59 AM
1- کلا ایدت غلطه. سعی نکن یه فرم توی Thread های غیر اصلی بذاری. همیشه دچار مشکل میشی چون مثلا کامپوننت تایمر یه پنجره درست میکنه که متاسفانه میره تو سرنخ اصلی و همه چی قاطی پاتی میشه.
2-برعکس عمل کن. اون کوئری خفن رو ببر تو یه سرنخ فرعی این یکی رو ببر تو اصلی.
3- اگر دقیقتر بگی شاید بهتر بفهمم.
littlerabbit
08-10-2006, 02:22 AM
راستی دستور معادل DoEvents در وی بی
Application.ProcessMessages هستش. میتونی از اون استفاده کنی کل مشکل قفل کردن ممکنه حل بشه!
Mojgan110
08-23-2006, 11:28 AM
[QUOTE]-برعکس عمل کن. اون کوئری خفن رو ببر تو یه سرنخ فرعی این یکی رو ببر تو اصلی[/
QUOTE]
فكر بكري بود . ( از شما غير از اين هم البته انتظار نداريم ).
الان ديگه موقع اجراي اون كوئري اصطلاحا" خفن ؛ فرم اصلي برنامه ام هم قفل نميكنه .
مشكل :: حالا Timer را آوردم در فرم اصلي و كوئري كوچيكه را داخل تايمر اجرا ميكنم . ولي باز هم چيزي نشون نميده . اصلن شايد كدش را غلط نوشته باشم :
اين كوئري كوچيكه هست :
Select :retCode = ( SELECT rowPos FROM tbPosition WHERE ( tbPosition.tbID = 1 ))
كه در OnTimer اجراش ميكنم : اينطوري :
DM.Qry3.ExecSQL;
Label1.Caption:= DM.Qry3.Parameters.ParamByName('retCode').Value;
و كل كد را هم اينطوري ::
Timer1.Enabled:= True;
TProgressThread.Create(False);
Timer1.Enabled:= False;
littlerabbit
08-23-2006, 11:37 AM
OK الان چک میکنم.
littlerabbit
08-23-2006, 12:20 PM
عزیز من راهنمای دلفی رو بخون! وقتی Query شما Select هست باید اون Open کنی. ExecSql واسه غیر Select هست.
Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).
Note: For SELECT statements, call Open instead of ExecSQL.
ExecSQL prepares the statement in SQL property for execution if it has not already been prepared. To speed performance, an application should ordinarily call Prepare before calling ExecSQL for the first time.
Mojgan110
08-23-2006, 04:11 PM
غلطه آي غلطه !
دهه !! من تست كردم كه ميگم !!
اتفاقا اگه با Open بنويسم ، كمپايلر فحشهاي دانماركي ميده !
تازشم اون كده هم درسته ! يهني كه توي يك برنامه جداگانه كه نوشتمش و تست كردم ، جواب گرفتم ... ولي وختي با هم تركيب ميشند ، چيزي نمايش داده نميشه . ( مثلا توي اون Label )
littlerabbit
08-23-2006, 05:54 PM
نوع پارامتر رو عوض کن.(پارامتر رو خروجی کن Output) در ثانی من زبون این کامپایلر رو میفهمم دانمارکی نیست. بنویس واست ترجمه میکنم.
Mojgan110
08-23-2006, 10:53 PM
نوع پارامتر رو عوض کن.(پارامتر رو خروجی کن Output) در ثانی من زبون این کامپایلر رو میفهمم دانمارکی نیست. بنویس واست ترجمه میکنم.
مرسي بخاطر پيگيري .
پارامتر نوعش خروجي هست . ببين ، من فكر نميكنم كه توي سينتكس و اينا مشكل داشته باشه .
فكر كنم بايد به مسائل ديگه اي فكر كنيم . مثلا اينكه آيا اون Thread ي كه توسط تايمر ساخته ميشه ، آپديت كردن گرافيكي VCL از داخل تايمر و اين جور چيزها و اينكه دلفي چطور اينها را هندل ميكنه و اين چيزها !
littlerabbit
08-26-2006, 06:25 PM
آپدیت لیبل رو بزار داخل یه تابع و بعد با اون توضیحی که توی یه Thread جدید که میسازی مینویسه!! :))) اونو اصلاح کن...
من که خودم هم نفهمیدم منظورم Syncronise (درست نوشتم؟؟) کردنه!!!
وی بولتین نسخه 3.8.0 Release Candidate 1, تمام حقوق محفوظ می باشد ©
2000-2009, نرم افزار تجاری شرکت Jelsoft