PDA

View Full Version : مشکل با فرم ، تایمر ، Thread ، SQL !!



Mojgan110
سه شنبه 17 مرداد 1385, 11:01 صبح
اوووه ! نمیدونم چجوری مشکل را بگم !! خیلی یه جوریه !

یک فرم دارم ! که یک تایمر داخلش گذاشتم . ( کامپوننت TTimer ) و داخل ایونت مربوط به این تایمر ، یک دستور کوتاه و کوچک ُSQL را در فواصل زمانی مثلا یک دهم ثانیه ای اجرا میکنم.

خب ...

حالا ! یک Thread جدید هم ساخته ام و از داخل این Thread ، اون تایمره را فعال میکنم و دستور نمایش فرمی که گفتم همین تایمره هم توشه را هم میدهم .


frmWait.Timer1.Enabled:= True;
frmWait.Show;

خب ...

برنامه اصلی ، خودش باید که یک کوئری طولانی که 6-7 ثانیه اجراش طول میکشه را اجرا کنه.
قبل از اینکه این کوئری طولانیه را شروع به اجرا کنم ، اون ترد جدیده را هم اجرا میکنم . ( که در واقع فرم مربوطه اش را نشون بده و تایمرش هم شروع کنه به اجرای اون دستور SQL کوچیکه) . و خب حالا کوئری طولانیه را هم اجرا میکنم و ...

ولی بدبختی اینه که با وجود اینکه اون فرمه را نشون میده ، ولی فرمش قفل میکنه و تا وقتی که اجرای اون دستور کوئری بزرگه تموم نشده باشه ، تکون نمیخوره و مثلا اگر یک Label‌هم روش باشه ،‌اون را هم نشون نمیده .

با این اوصاف ! نظری دارید ؟ http://my.blackmice.com/images/bs/sad.gif

ضمنا من درست درباره Thread اطلاع و اینا ندارم ( فکر کنم سه چهار ترم دیگه ، توی سیستم عامل درسش میدند گویا ). این داستانها را گفتم که شاید مشکل در نحوه استفاده از Thread م باشه و شما نظر کارشناسیتون را بدین

vcldeveloper
چهارشنبه 18 مرداد 1385, 08:11 صبح
فعال کردن تایمر موجود در یک فرم از داخل یک Thread موجب نمیشه که عملیاتی که در اون فرم صورت میگیره در داخل Thread مربوطه اجرا بشند. شما باید کوئری مربوطه را در داخل Thread اجرا کنید تا در هنگام اجرای کوئری اصلی متوقف نشه. در ضمن دقت کنید که در داخل یک Thread از کدهای مربوط به بروزرسانی رابط کاربر نباید استفاده کنید؛ برای این منظور باید از روش های همزمان سازی استفاده کنید که ساده ترین حالتش استفاده از Synchronize هست.

Mojgan110
چهارشنبه 18 مرداد 1385, 20:00 عصر
باید کوئری مربوطه را در داخل Thread اجرا کنید
میخواهم که کوئریه ، در فواصل زمانی معینی اجرا بشه . برای همین دستور اجرای Query را داخل تایمر نوشتم . تایمر را هم روی اون فرمه گذاشته ام . حالا اگر بخواهم اینطور که شما میفرمایید عمل کنم ، آنوقت باید به گونه ای Timer را بیارم توی Thread که بتونم صداش بزنم . ولی چگونه ؟ http://qsmile.com/qsimages/306.gif

vcldeveloper
پنج شنبه 19 مرداد 1385, 08:48 صبح
تایمر یه کامپوننت non-visual هست، می تونید اونو در خارج یک فرم هم استفاده کنید. البته مطمئن نیستم که آیا کامپوننت Timer توی یک Thread درست عمل میکنه یا نه. اگر درست عمل نکرد، می تونید از کامپوننت های Timer ایی که از Thread پشتیبانی می کنند استفاده کنید.