PDA

View Full Version : سوال: چرا در استفاده از for برنامه هنگ میکنه.



Mask
جمعه 06 شهریور 1388, 14:01 عصر
با سلام به همه دوستان
یه برنامه نوشتم که میاد از 4 تا تیبل اطلاعات رو میخونه به صورت زیر
اول از تیبل یک ، یک عدد و از تیبل دوم یه عدد دیگه رو میخونه ضربدر هم میکنه و در یه متغیر میریزه و تقسیم بر یه عدد داخل تیبل سوم می کنه و جمعشو میریزه داخل تیبل چهارم و درون یه گرید نشون میده.
حالا یه مشکل: اینکارهارو من با حلقه انجام میدم . نمیدونم چرا وقتی اطلاعات زیاده و تیبلا پره برنامه هنگ میکنه و قفل میشه. باید از چی استفاده کنم که برنامه قفل نکنه .
ممنون اگه جوابمو بدید.

Hsimple11
جمعه 06 شهریور 1388, 15:37 عصر
اول بگید که از چه دیتابیسی استفاده میکنید. بجای For از دستورهای خود SQL استفاده کنید. برای تمامی اعمال ریاضی :



SELECT AliasName= <Calculate Expression> From MyTable

یا


SELECT <Calculate Expression> As AliasName From My Table

Mask
جمعه 06 شهریور 1388, 18:31 عصر
ممنون از دوستان بابت جوابتون

از بانک Access 2003 استفاده می کنم

در ضمن من داخل بانک اول یک سری هزینه رو به دست میارم که حلقه دوم به این هزینه ها برای عملیاتش نیاز داره و در حلقه دوم کلیه هزینه ها با کلیه مبالغ پرداختی طرف حساب محاسبه میشه و در حلقه آخر صورت حساب مشتری محاسبه میشه

که همه این ها باید با هم دیگر محاسبه بشه چون به همدیگر نیاز دارند و من از حلقه For استفاده کردم چون راه دیگه پیدا نکردم
من از دستورات sql در حلقه استفاده میکنم اما باز برنامه به علت ازدیاد رکوردها و دیتا هنگ میکنه.

ممنون

Mahmood_M
جمعه 06 شهریور 1388, 19:33 عصر
من از دستورات sql در حلقه استفاده میکنم اما باز برنامه به علت ازدیاد رکوردها و دیتا هنگ میکنه.
منظور از هنگ کردن اینه که برنامه کمی هنگ می کنه و با رسیدن به آخر جدول ، حلقه به پایان می رسه و برنامه به حالت عادی بر می گرده ؟ یا اینکه حلقه اصلا به پایان نمی رسه و برنامه از حالت هنگ ! بیرون نمی یاد ؟
اگه مشکل حالت اوله ، می تونید در پایان حلقه از ProcessMessages استفاده کنید ، مثال :


for I := 0 to 10 do
begin
...
application.ProcessMessages;
end;

اما اگه مشکل حالت دومه ، بهتره کدی که در حلقه می نویسید اینجا بزارید تا جواب بهتری بگیرید ...

موفق باشید ...

mehdimdp
جمعه 06 شهریور 1388, 23:51 عصر
(البته اگه در كدنويسي اشتباهي نكرده باشيد) احتمالا برنامه شما هنگ نميكنه و برنامه درحال انجام كار خودش هست
شايد زمان انجام دستورات و به پايان رسيدن حلقه طولاني هست.

Mask
یک شنبه 08 شهریور 1388, 23:25 عصر
البته اگه در كدنويسي اشتباهي نكرده باشيد) احتمالا برنامه شما هنگ نميكنه و برنامه درحال انجام كار خودش هست
شايد زمان انجام دستورات و به پايان رسيدن حلقه طولاني هست
احسنت دقیقا همینه که این دوستمون میگه.
چون وقتی اطلاعات کمه برنامه یه هنگ چند ثانیه ای می کنه و نتیجه رو اعلام می کنه .
البته این هنگ منطقیه چون استفاده از حلقه میاد و کل حافظه رو چند ثانیه کامل می گیره و محاسبات رو انجام میده و نتیجه اعلام میشه و سیستم از هنگ در میاد.
اومدم و دستورات محاسباتم رو گزاشتم داخل تایمر که سیستم هنگ نکنه اما چون تایمر بر اساس اینورتال عمل می کنه وقتی به زمان اینورتال میرسه چه محاسبات انجام شده باشه چه انجام نشده باشه میره رکورد بعدی ، که بازم اینجا برنامه قفل می کنه.
چیکار کنم این محاسبات کوفتی رو که راحت انجام بشه و سیستم قفل نکنه.
مدت زمانش زیاد مهم نیست.
ممنون از دوستان.

Mahmood_M
دوشنبه 09 شهریور 1388, 04:38 صبح
چیکار کنم این محاسبات کوفتی رو که راحت انجام بشه و سیستم قفل نکنه.
مشکلتون با Process Messages حل نشد ؟
اگر عملیات سختی ! در حال انجام هست بهتره از Thread استفاده کنید (http://barnamenevis.org/forum/showthread.php?t=79463) ...

موفق باشید ...

M aJi D
دوشنبه 09 شهریور 1388, 22:36 عصر
سلام.
دوست عزیز میتونی از quary خود accessاستفاده کنی بعد از خروجی اون استفاده کنی .اینجوری اطلاعات بدون اومدن تو dataset پردازش میشن و خروجی سبک میاد تو دیتاست.
اگر نمیدونید چجوری تیبلاتون با فیلداش را اینجا بگید و بگید چه فیلیدی مورد نظرتونه تا بگم.
برای راهنمایی بهتر for های برنامه خودتونم بنویسید.

mehdimdp
دوشنبه 09 شهریور 1388, 23:49 عصر
خب براش يه SPLASH درست كن

FiACKER
سه شنبه 10 شهریور 1388, 01:13 صبح
بهترين گزينه براي مشكله شما استفاده از thread هاست.

با استفاده از توابع api تردينگ رو امتحان كنيد كه خطايي مي ده يا نه ! اين كار خيلي راحته و فقط يه تابع مي سازين و به ترد مي فرستيدش پس خيلي سريع مي تونيد تست كنيد.

اگه خطايي دريافت كرديد از كلاسه tthread ه خوده دلفي استفاده كنيد.

samprp
سه شنبه 10 شهریور 1388, 05:39 صبح
به نظرتون بهتر نیست اول همه اعداد از سه تیبل رو بخونید (با یه کوئری) یعد تو یه حلقه For که طبیعتا سریعتر هم اجرا می شه روشون محاسبات انجام بدید؟

Mask
جمعه 13 شهریور 1388, 14:54 عصر
به نظرتون بهتر نیست اول همه اعداد از سه تیبل رو بخونید (با یه کوئری) یعد تو یه حلقه For که طبیعتا سریعتر هم اجرا می شه روشون محاسبات انجام بدید؟

نمیشه عزیز . همه باید با هم محاسبه بشن.

hadisalahi2
شنبه 14 شهریور 1388, 13:47 عصر
چرا از حلقه For استفاده میکنید؟ مگه تعداد رکوردهای جدولتون ثابته و تعداد رکوردها مشخصه؟
به نظر شما نباید از حلقه While استفاده کنید؟

Mahmood_M
شنبه 14 شهریور 1388, 23:38 عصر
چرا از حلقه For استفاده میکنید؟ مگه تعداد رکوردهای جدولتون ثابته و تعداد رکوردها مشخصه؟
به نظر شما نباید از حلقه While استفاده کنید؟
...

For I := 0 to ADOTable.RecordCount do

موفق باشید ...

mehdimdp
یک شنبه 15 شهریور 1388, 09:09 صبح
نگفتي چرا براش يه splash با عنوان "لطفا صبر كنيد" نميسازي؟

Hamid.Kad
دوشنبه 16 شهریور 1388, 11:46 صبح
دوست عزیز اگه کدتون رو اینجا قرار بدید مطمئن باشید مشکلتون سریعتر حل میشه