PDA

View Full Version : نشان دادن یک Progressbarدر حین انتقال اطلاعات؟



AlirezaBahredar
جمعه 23 شهریور 1386, 00:42 صبح
با سلام....
از دوستان کسی هست که در این زمینه کار کرده باشه؟
ببینید من می خوام در حین عملیاتی که برنامه داره انجام می ده(حالا این عملیات می تونه fetch کردن اطلاعات از دیتا بیس یا لوود کردن اطلاعات از یک فایل متنی یا بطور مثال pingکردن باشه) یک Progressbar یا یک Splash ساده که نشون بده سیستم در حال کارکردن هست نشون بده ودر انتهای عملیات این Progressbar یا Splash خاتمه پیدا کنه؟با این توضیح که از Thread هم که استفاده می کنم باز هم به موقع نمایش داده نمیشه ودر ضمن در انتها در برخی موارد Splash خاتمه پیدا نمی کنه....ممنون میشم راهنماییم کنید....

Mahmood_M
جمعه 23 شهریور 1386, 08:46 صبح
کنه؟با این توضیح که از Thread هم که استفاده می کنم باز هم به موقع نمایش داده نمیشه ودر ضمن در انتها در برخی موارد Splash خاتمه پیدا نمی کنه....ممنون میشم راهنماییم کنید....
آیا از Synchronize استفاده میکنید ؟! ، بهتره که عمل Progress رو در یک Procedure جدا انجام بدید و در Thread به وسیله Synchronize اون رو اجرا کنید ( Procedure مربوط به Progress رو )
در مورد خاتمه پیدا نکردن هم ، باید مطمئن بشید که Thread شما آزاد شده ...
درچه موقع Progress رو قطع میکنید یا Splash رو میبندید‌؟ ( داخل Thread ؟ آیا از Synchronize استفاده میکنید‌؟ )

AlirezaBahredar
جمعه 23 شهریور 1386, 11:33 صبح
آیا از Synchronize استفاده میکنید ؟! ، بهتره که عمل Progress رو در یک Procedure جدا انجام بدید و در Thread به وسیله Synchronize اون رو اجرا کنید ( Procedure مربوط به Progress رو )
در مورد خاتمه پیدا نکردن هم ، باید مطمئن بشید که Thread شما آزاد شده ...
درچه موقع Progress رو قطع میکنید یا Splash رو میبندید‌؟ ( داخل Thread ؟ آیا از Synchronize استفاده میکنید‌؟ )

آقا محمود عزیز.....
من آشنایی ابتدایی با Thread ها دارم....در حد اینکه یک نخ ایجاد کنم(متد Create) یا اونها را معلق کنم(متد suspend) یا دوباره از حالت معلق بودن خارج کنم (متد resume) یا اونها رو خاتمه بدم (متد Terminate) اما در مورد همزمانسازی یا به قول شما Synchronize اطلاع دقیقی ندارم ممنون میشم منو راهنمایی کنی.....موفق باشی....

Mahmood_M
جمعه 23 شهریور 1386, 12:38 عصر
آقا محمود عزیز.....
من آشنایی ابتدایی با Thread ها دارم....در حد اینکه یک نخ ایجاد کنم(متد Create) یا اونها را معلق کنم(متد suspend) یا دوباره از حالت معلق بودن خارج کنم (متد resume) یا اونها رو خاتمه بدم (متد Terminate) اما در مورد همزمانسازی یا به قول شما Synchronize اطلاع دقیقی ندارم ممنون میشم منو راهنمایی کنی.....موفق باشی....
برای این که از داخل Thread به سایر اشیای روی فرم دسترسی داشته باشید ( البته همه نه ) باید دسترسیتون در یک Procedure جدا انجام بشه و سپس با دستور Synchronize اون رو اجرا کنید ...
به عنوان مثال اگه میخواید که عمل Progress برای یک ProgressBar رو انجام بدید ، اول اون رو در یک Procedure جدا می نویسید :

Procedure Progress;
begin
ProgressBar1.Position := ProgressBar1.Position + 1;
end;

بعد باید توی Thread اون رو با Synchronize صدا بزنید :

Synchronize(Progress);

توجه کنید که Procedure مربوط به ProgressBar ( در اینجا همون Progress ) باید در قسمت Private یا ... ، خود Thread باشه ( یعنی متعلق به اون باشه )
به این صورت :

MyThread = Class(TThread)
Private
Procedure Progress;
...
end;

...

Implementation

Procedure MyThread.Progress;
begin
ProgressBar1.Position := ProgressBar1.Position + 1;
end;

من قبلا یک برنامه نمونه برای کپی فایل با استفاده از Thread و نمایش ProgressBar توی سایت گذاشته بودم ،‌میتونید دانلود کنید و کدش رو نگاه کنید ، شاید کمکتون کنه ...

لینک برنامه :
http://barnamenevis.org/forum/showpost.php?p=309025&postcount=132

برای اتمام کار Thread هم می تونید از Terminate و WaiteFor استفاده کنید ،‌ WaiteFor منتظر میمونه تا کار Thread به پایان برسه و بعد اون رو Free می کنه ( البته باید خودتون Terminate اش کنید ) :


MyThread.WaiteFor;
MyThread.Terminate;

شاید توضیحاتی که دادم کامل نباشه ولی استادانی ( مثل آقای کشاورز ) در این زمینه اطلاعاتی بهتون خواهند داد ...

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

siramin
شنبه 24 شهریور 1386, 14:43 عصر
اتفاقا من هم یه همچین مشکلی دارم البته در یک الگوریتم
می خوام برای مثال مقدار پیشرفت یک دی کد کردن ساده را بدونم
من یه برنامه دیکدر - انکدر( Encoder-Decoder )دارم که مثلا در یکی از قسمتهای اون 10.000.000 کاراکتر رو در 10 ثانیه دیکد می کنه ، اما وقتی progressbar رو قرار می دم و اون رو راه می اندازم (که درست هم کار می کنه) سرعت تبدیل 10.000.000 کاراکتر 30 ثانیه می شه، یعنی 3 براب:ناراحت:ر
چکار کنم که سرعت اینقدر پایین نیاد؟

Mahmood_M
شنبه 24 شهریور 1386, 16:26 عصر
چکار کنم که سرعت اینقدر پایین نیاد؟
احتمالا اگر از یک Thread برای ProgressBar و از Synchronize استفاده کنید ، مشکل سرعت حا خواهد شد ( البته شاید همون 10 ثانیه نشه ولی قابل قبول هست )

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

siramin
شنبه 24 شهریور 1386, 19:13 عصر
اگه لطف کنی و بیشتر توضیح بدی ممنون می شم، آخه در این مورد اصلا اطلاعاتی ندارم
برای مثال این تیکه کدی از برنامه هستش که کار اصلی رو انجام می ده


//----------------------------------------
for i:=1 to (Len div 8) do Begin
str:='';
j:=1;
while(j<=8)AND(n<=Leng)do
if num[n]in['0','1'] Then Begin
str:=str+num[n];
inc(n);
inc(j);
End
Else
inc(n);
temp1:='NO';
Temp2:='NO';
res:=res+CHR(strtoint(Form1.BinToDec(str,temp1,tem p2)));
End;
//----------------------------------------

حالا به این تیکه کد چی اضافه کنم؟

siramin
دوشنبه 26 شهریور 1386, 13:49 عصر
جواب نمی دین؟

Mahmood_M
چهارشنبه 28 شهریور 1386, 10:12 صبح
جواب نمی دین؟
این مقاله (http://barnamenevis.org/forum/showthread.php?t=79463) رو بخونید ، اگر موفق نشدید ، من کد رو براتون درست می کنم ...

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