PDA

View Full Version : شروع عملیات بعد از نمایش فرم



Saeid59_m
پنج شنبه 15 شهریور 1386, 10:27 صبح
سلام دوستان
من می خواهم بعد از ظاهر شدن فرم بلافاصله یک ProgressBar شروع به پر شدن بکنه .
اما کد مورد نظر رو توی OnCreate و یاOnShow که می نویسم فقط بعد از پایان عملیات فرم نشون داده خواهد شد . یعنی پر شدن Progress Bar ‌رو نمی تونم ببینم .
لطفاً‌ راهنمائی کنید . ممنون

Arman_1367
پنج شنبه 15 شهریور 1386, 10:47 صبح
ببین در این جور مواقع دو تا راه داری بین کاری که داری انجام می دهی مثلاً در حلقه ای که هستی چند بار Application.ProccesMessage را فراخوانی کنی.

دوم اینکه از یک Threadمجزا جهت انجام عملیاتت استفاده کنی مثل روش زیر :

unit Unit2;

interface

uses
Classes, ComCtrls, Windows;

type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
Public
ProgressBar :TProgressBar ;
end;

implementation



{ TMyThread }

procedure TMyThread.Execute;
begin
{ Place thread code here }
if ProgressBar=nil then exit;
while (ProgressBar.Position<100) do
begin
ProgressBar.Position:=ProgressBar.Position+1;
Sleep(80);
end;
DoTerminate;
end;

end.

و در رویداد FromShow هم کد زیر را وارد کنی :

with TMyThread.Create(true) do
begin
ProgressBar:=ProgressBar1;
Suspended:=false;
end;

Will_Smith
پنج شنبه 15 شهریور 1386, 17:56 عصر
به نظر من این راهی که آقای آرمان خان میگن زیاد جالب نیست
عمل میکنه ولی ProgressBar شما واقعی نیست یعنی شمارشش ارتباطی با عملیات شما نداره
شما باید بین عملیاتتون مقدار ProgressBar>position رو تغییر بدید و اضافه کنید نه در یک نخ جدا که ربطی به عملیات هم نداشته باشه
شما بعد از هر خط یا دو سه خط از کدتون چند واحد به Progressbar اضافه کنید
این کار قشنگ تره

Arman_1367
پنج شنبه 15 شهریور 1386, 21:42 عصر
ه نظر من این راهی که آقای آرمان خان میگن زیاد جالب نیست
عمل میکنه ولی ProgressBar شما واقعی نیست یعنی شمارشش ارتباطی با عملیات شما نداره
شما باید بین عملیاتتون مقدار ProgressBar>position رو تغییر بدید و اضافه کنید نه در یک نخ جدا که ربطی به عملیات هم نداشته باشه
شما بعد از هر خط یا دو سه خط از کدتون چند واحد به Progressbar اضافه کنید
این کار قشنگ تره

دوست عزیز من نمی دونم شما تا حالا چقدر با برنامه های MultiThread کار کرده اید اما اگر یکم تجربه می داشتید می فهمیدید که می شود یک مقدار را به صورت public برای Thread تعریف کرد و از Thread اصلی مقدار را برای این یکی فرستاد و ... که خیلی مباحث جالبی هستند در ضمن اگر راه اول من را می خواندید متوجه می شدید که روش شما را هم گفتم در ضمن اگر در بین عملیات یا حلقه به برنامه اجازه proccess کردن پیغام ها را ندید در یک Thread برنامه شما قفل می کنه و من در اکثر برنامه هایی که دیدم افراد ناشی می نویسند و بعد مثلاً خانم دکتر X مجبور می شه اصلاحشون کنه و دوباره پول بدهدو.... .

راستی قبل از اینکه نظر شخصی بدهید در ایتنرنت منبع به این بزرگی گشتی بزنید بیبنید اساتید چه می گویند.

kamal_habibi
جمعه 16 شهریور 1386, 02:20 صبح
آقای سعید من از این مثالی که براتون فرستادم استفاده میکنم
امیدوارم که به دردتون بخوره

Will_Smith
جمعه 16 شهریور 1386, 10:44 صبح
ای بابا oxygenws (http://barnamenevis.org/forum/member.php?u=4661) چرا دعوا و بحث ما فقط برای کمک کردن اینجا هستیم
هر کسی باید یه مقدار انتقاد پذیر باشه
ببینید به نظر من وقتی که بشه کاری رو بدون کد نویسی اضافی و افزایش حجم برنامه انجام داد لازم نیست با اضافه کردن یک یا چند یونید اضافی و ایجاد شی ء و افزایش Usage حافظه انجام داد
آرمان جون شما حق داری از نظر خودت دفاع کنی نه اینکه فعالیت برای کمک رو نظر شخصی بخونید.

توی پست های قبلیت هم از Thread زیاد استفاده کرده بودی. استفاده زیاد از Thread اصلا پیشنهاد نمیشه .همون طوری که میتونه مفید باشه به همون اندازه غیر مفید...

Arman_1367
جمعه 16 شهریور 1386, 11:40 صبح
توی پست های قبلیت هم از Thread زیاد استفاده کرده بودی. استفاده زیاد از Thread اصلا پیشنهاد نمیشه .همون طوری که میتونه مفید باشه به همون اندازه غیر مفید...

دقیقاً حق با شماست استفاده غلط و بی جا از یک thread می تواند موجب خیلی از ایرادها شود اما اصلاً روش اصولی که توسط شرکت مایکروسافت جهت انجام دو عملیات هم زمان در نظر گرفته شده و معرفی شده این روش می باشد. خوب آیا سازنده سیستم عامل روش غلطی را معرفی می کند.
راستی استفاده صحیح و مدیریت درست نخها باعث کیفیت و سرعت بالای برنامه می شود.در ضمن من هرجایی هر روش خاص که مناسب باشه را پیشنهاد می کنم اگر به پستهای من از قدیم تا حالا سر بزنی متوجه می شی که از روشهایی مثل این هم در جای خودش استفاده کردم و معرفی هم کردم.

Will_Smith
جمعه 16 شهریور 1386, 12:41 عصر
ببینید به نظر من وقتی که بشه کاری رو بدون کد نویسی اضافی و افزایش حجم برنامه انجام داد لازم نیست با اضافه کردن یک یا چند یونید اضافی و ایجاد شی ء و افزایش Usage حافظه انجام داد

نظری در مورد این نداری
البته هر کسی روش هایی رو برای خودش داره
راستی از کجا فهمیدی که توی سییستم عامل ویندوز و در این قسمت ( مثلا هنگام کی کردن فایل) برای افزایش مقدار Progress از Thread استفاده شده؟ برات مقدور هست که منبعی معرفی کنی؟

Arman_1367
جمعه 16 شهریور 1386, 13:26 عصر
از سایت Msdn می توانی استفاده کنی و از کتاب :
Borland Delphi 7 Developer Giude

فصل 13 صفحه 741 هم می توانی استفاده کنی.


ببینید به نظر من وقتی که بشه کاری رو بدون کد نویسی اضافی و افزایش حجم برنامه انجام داد لازم نیست با اضافه کردن یک یا چند یونید اضافی و ایجاد شی ء و افزایش Usage حافظه انجام داد

در رابطه با افزایش Usage نظر شما را قبول ندارم چون فرقی که نمی کنه بلکه ممکنه Usage شما را افزایش دهد.چون در هنگام کار با فایل حجیم برنامه قفل می کنه اگر هم بخواهی در یک نخ اجازه پروسس پیغامها را بدهید که سرعت پاینی خواهید داشت و مسائل دیگر.

Mahyaa
جمعه 16 شهریور 1386, 14:39 عصر
سلام دوستان
من می خواهم بعد از ظاهر شدن فرم بلافاصله یک ProgressBar شروع به پر شدن بکنه .
اما کد مورد نظر رو توی OnCreate و یاOnShow که می نویسم فقط بعد از پایان عملیات فرم نشون داده خواهد شد . یعنی پر شدن Progress Bar ‌رو نمی تونم ببینم .
لطفاً‌ راهنمائی کنید . ممنون

این progress bar قراره درصد پیشرفت چه عملیاتی رو نشون بده ؟ یعنی چی تا فرم نمایش داده میشه Progress Bar پر بشه ؟

OnCreate که از اسمش معلومه چه موقع fire میشه و OnShow هم قبل از Activate و Paint هستش .

Saeid59_m
شنبه 17 شهریور 1386, 06:53 صبح
آقای سعید من از این مثالی که براتون فرستادم استفاده میکنم
امیدوارم که به دردتون بخوره
ممنون از راهنمائی تون
خودم هم مجبور به استفاده از این روش شدم . ولی احساس می کنم اگه سیستم کند باشه و زمان ساخته شدن و نمایش فرم بیش از 50 میلی ثانیه طول بکشه . دستور العمل شما درست کار نخواهد کرد .

Saeid59_m
شنبه 17 شهریور 1386, 06:56 صبح
این progress bar قراره درصد پیشرفت چه عملیاتی رو نشون بده ؟ یعنی چی تا فرم نمایش داده میشه Progress Bar پر بشه ؟

OnCreate که از اسمش معلومه چه موقع fire میشه و OnShow هم قبل از Activate و Paint هستش .
دوست عزیز همین کاری رو که می گید توی دلفی انجام بدین . مشکل مشخص می شه . اگه به نتیجه رسیدید من رو هم راهنمائی کنید ممنون می شم .

Mahyaa
شنبه 17 شهریور 1386, 07:19 صبح
دوست عزیز همین کاری رو که می گید توی دلفی انجام بدین . مشکل مشخص می شه . اگه به نتیجه رسیدید من رو هم راهنمائی کنید ممنون می شم .

کدوم کار رو توی دلفی انجام بدم ؟
اگر مشکل نمایش دادن Progress Bar در ابتدای نمایش اصلیه ، خوب شما Event مناسبی رو انتخاب نکردید . به اضافه اینکه ، هنوز نمیدونم این Progress Bar اصلا برای چه کاری باید نمایش داده بشه . یعنی کاربر منتظر میمونه تا چه کاری براش انجام بشه ؟