PDA

View Full Version : چگونه از قفل شدم فرم جلوگيري کنم؟ جلوگيري از بسته شدن پروسس؟



hamedsoft
پنج شنبه 02 خرداد 1387, 10:20 صبح
با سلام خدمت تمامي دوستان گرامي،

من دو تا سؤال برام پيش اومده که خودم دقيق نمي دونم اصطلاح اين کار چي هست تا بتونم تو اينترنت جستجو کنم واسه همين مزاحم شما شدم :چشمک:

سؤال اول: اگه دقت کرده باشيد هنگامي که کار سنگيني (ترجيحا يک پروسس تکي سنگين) در فرم صورت مي گيره، فرم به اصطلاح به حالت هنگ (يا همون قفل) در مياد و مادامي که اون پروسس تموم نشده کاربر احساس مي کنه که فرم Lock شده و نمي تونه اون رو جابجا کنه در صورتي که من در بسياري از برنامه ها (مخصوصا پروسس هاي خود ويندوز) ديدم که هنگامي که پردازش هاي سنگين هم انجام ميشه اين حالت براي فرم پيش نمياد بلکه بخشي از فرم که نشون دهنده اين هست که پردازش در حال انجام هست در حال کار هست (مثلا با نمايش يک پيام انتظار يا ...) - اميدوارم سؤالم رو خوب مطرح کرده باشم و منظورم رو خوب منتقل کرده باشم :لبخند: ، البته من منظورم استفاده از Application.ProcessMessages که براي پردازش هاي پشت سر هم انجام ميشه نيستش چرا که اون فقط وقتي تأثيرش رو نشون ميده که پردازش قبلي کامل تموم شده باشه.

سؤال دوم: من ميخوام کاري کنم تا برنامه حتي از بخش Process مربوط به Task Manager ويندوز هم نتونه End Process بشه، چيزي شبيه برنامه هاي امنيتي مثل Deep Freeze که اگه دقت کرده باشيد وقتي کاربر سعي مي کنه Process مربوط به Deep Freeze رو ببنده با پيام خطا مواجه ميشه.

vcldeveloper
پنج شنبه 02 خرداد 1387, 12:19 عصر
جواب سوال اول:
پردازش های سنگین را باید در یک Thread جداگانه اجرا کنید. در حالت عادی Thread اصلی برنامه وظیفه رسم و بروزرسانی رابط کاربر را برعهده دارد. وقتی در همین Thread پردازش سنگینی صورت می گیرد، Thread اصلی فرصت بروز کردن رابط کاربر و پاسخ به درخواست های کاربر را پیدا نمی کند؛ در نتیجه رابط کاربر به حالت قفل شده در میاید.
درباره نحوه ایجاد Thread و مفهوم Thread قبلا بحث شده.

جواب سوال دوم:
باید در تاپیک جداگانه ایی مطرح شود. هر تاپیک برای بحث درباره یک سوال است.

persianboy
پنج شنبه 02 خرداد 1387, 16:06 عصر
سلام ، سه تا کامپوننت میزارم که دوتاش کار آقای سالار خلیل زاده(Salarsoft) ست ، در ضمن برای بسته نشدن پروسسها باید دنبال عبارت hook procesess یا hook api توی اینترنت بگردی که من توصیه میکنم سری به سایت www.madshi.net ، قسمت هوک ای پی آی ش بزنی که یه سری کامپوننت و مثال واسه این کار داره یه نگاهی هم به سمپله خودم بنداز ، البته مشکلی که داره اینه که از توی کاربر مهمان ویندوز میشه بستش .

Zahed2008
یک شنبه 19 آبان 1387, 13:46 عصر
سلام، در مورد سوال اول باید بگم که اگه بخوای یه کار بی دردسر انجام بدی و فقط می خوای که ظاهر فرم برنامه ات حفظ بشه، می تونی از دستور Repaint برای فرمت استفاده کنی. به عنوان مثال :

for i:=1 to 1000 do begin
...
Form1.Repaint;
...
end;

vcldeveloper
یک شنبه 19 آبان 1387, 16:02 عصر
سلام، در مورد سوال اول باید بگم که اگه بخوای یه کار بی دردسر انجام بدی و فقط می خوای که ظاهر فرم برنامه ات حفظ بشه، می تونی از دستور Repaint برای فرمت استفاده کنی.
این میشه مشابه همون کاری که Application.ProcessMessages انجام میده. البته با قابلیت کمتر.

Mask
سه شنبه 21 آبان 1387, 18:32 عصر
سلام ، سه تا کامپوننت میزارم که دوتاش کار آقای سالار خلیل زاده(Salarsoft) ست ، در ضمن برای بسته نشدن پروسسها باید دنبال عبارت hook procesess یا hook api توی اینترنت بگردی که من توصیه میکنم سری به سایت www.madshi.net (http://www.madshi.net) ، قسمت هوک ای پی آی ش بزنی که یه سری کامپوننت و مثال واسه این کار داره یه نگاهی هم به سمپله خودم بنداز ، البته مشکلی که داره اینه که از توی کاربر مهمان ویندوز میشه بستش .
دوست عزیز من وارد این سایت شدم و فایل madCollection.exe رو هم دانلود کرم اما وقتی میخاد نصب بشه liseen می خاد باید چیکار کنم.
و وقتی نمونه برنامه Hook API.rar (http://barnamenevis.org/forum/attachment.php?attachmentid=18083&d=1211457871) رو دان کردم نمیشه فایل dpr رو ادیت کرد این ایراد
[Fatal Error] ALIREZA.dpr(9): File not found: 'madRemote.dcu'
رو می گیره.
چی کار کنم.

vcldeveloper
چهارشنبه 22 آبان 1387, 04:22 صبح
madCollection قبلا رایگان بود، ولی بخاطر استفاده هایی که بعضی کاربران از آن برای تولید کدهای مخرب کردند، نویسنده آن تصمیم گرفت عرضه رایگان آن را متوقف کند.

AlirezaBahredar
چهارشنبه 22 آبان 1387, 13:39 عصر
حالا یکی رایگانشو به ما بده
یا LICENSE رو بدید
برای کدهای مخرب به خدا نمی خوام

عزیزم اینجا که امامزاده نیست قسم و آیه می دی......
Email خودتو تو یک PM خصوصی به من بده تا بگم از کجا تهیه کنی.
موفق باشی.

J870813986
پنج شنبه 28 اردیبهشت 1391, 15:01 عصر
مهندس جان آدرس رايگانش رو براي منم ايميل ميدي؟
jahani1357@yahoo.com
ممنون از لطف شما

mbshareat
پنج شنبه 28 اردیبهشت 1391, 15:35 عصر
سلام
ببخشید من ترد و اینجور چیزها تا حالا استفاده نکردم.
آیا با استفاده از Thread میشه انجام عملیات گرافیکی رو تسریع کرد؟ یا استفادش تنها جلوگیری از قفل برنامه است؟
جناب persianboy اگه میشه یه توضیحی در مورد ThreadTimer و ThreadWorker بدین .
آیا من می تونم در OnExecute تابع گرافیکی خودم رو اجرا کنم؟

Mask
پنج شنبه 28 اردیبهشت 1391, 15:39 عصر
آیا با استفاده از Thread میشه انجام عملیات گرافیکی رو تسریع کرد؟
استفاده از ترد به انجام سریعتر کدهای شما آنچنان کمکی نمیکنه. استفاده از این متود با عث میشه که مین ترد به بازسازی اینترفیس برنامه و عملیات دیگه راحت تر برسه.
سرعت انجام عملیات گرافیکی یا ریاضی به قدرت پردازنده و رمتون بر میگرده.


مورد ThreadTimer و ThreadWorker

من به شخصه استفاده از این ابزارها رو پیشنهاد نمیکنم. من قبل ازشون استفاده میکردم. مشکلاتی برام پیش می آورد(البته در برنامه های کاربردی و بزرگ).
بهتره برای اجرای ترد خودتون کد نویسی کنید و مدیریتش رو خودتون به عهده بگیرید.
موفق باشید.

Felony
پنج شنبه 28 اردیبهشت 1391, 17:26 عصر
آیا با استفاده از Thread میشه انجام عملیات گرافیکی رو تسریع کرد؟
چه عملیات گرافیکی ؟ توسط ترد میشه چند پردازش رو به صورت موازی انجام داد ، شما میتونید عملیات گرافیکیتون رو به بخش های مختلفی تقسیم کنید و انجام هر بخش رو به یک ترد بسپارید و در آخر کار اطلاعات این تردها رو جمع آوری کنید ، حالا به جای اینکه مثلا برای 4 عملیات 4 ثانیه صبر کنید ( فرض کنید در این مثال هر عملیات 1 ثانیه طول میکشه ) میتونید 4 ترد بسازید که همزمان کار کنن و هرکدوم یک کار رو انجام بدن و تو مدت 1 ثانیه اون کار ها رو انجام بدید ؛ این مثال خیلی خوشبینانه بود ولی در کل بله ؛ شدنیه .

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


استفاده از ترد به انجام سریعتر کدهای شما آنچنان کمکی نمیکنه.
!

Mask
پنج شنبه 28 اردیبهشت 1391, 18:41 عصر
ستفاده از ترد به انجام سریعتر کدهای شما آنچنان کمکی نمیکنه.
این جمله رو در مثالی که برای خودم پیش اومده میبینم.
من در یه تردی از صفحه دسکتاپ عکس میگیرم(به طور مثال در حلقه ای برای 1000 بار ) و در فایلی ذخیره میکنم . با اینکه این عملیات داره در یه ترد دیگه اجرا میشه و برنامه قفل نیست اما مقدار usage سی پی یو با حالت تک ترد فرقی نمیکنه و همچنین سرعتی در عکس گرفتن و ریخته شدن در فایل حس نمیشه. به جز مواقعی که مثل مثال شما چندین عملیات رو نیاز باشه پشت سر هم انجام بدیم ، که در این صورت با موازی انجام دادن این عملیات زودتر به پایان عملیات کاری میرسیم.

mbshareat
جمعه 29 اردیبهشت 1391, 00:29 صبح
یه سوال دیگه که مستقیما به موضوع تاپیک مربوط نمیشه: آیا استفاده از Application.ProcessMessages در یک حلقه باعث نمیشه سرعت برنامه به شدت پایین بیاد؟

Felony
جمعه 29 اردیبهشت 1391, 05:43 صبح
یه سوال دیگه که مستقیما به موضوع تاپیک مربوط نمیشه: آیا استفاده از Application.ProcessMessages در یک حلقه باعث نمیشه سرعت برنامه به شدت پایین بیاد؟
بارها در مورد Application.ProcessMessage تو این بخش توضیح دادم ؛ بستگی داره تو Message Queue ترد اصلی برنامتون چه پیغام هایی وجود داشته باشه و تعدادشون چند تا باشه ، ولی در کل استفاده از ProcessMessage در یک حلقه علاوه بر اینکه تائثیر بسزایی تو کاهش سرعت داره ، کارخطرناک و غیر فنی هم هست .