PDA

View Full Version : سوال: ساخت برنامه 2 وجهی



Mask
پنج شنبه 13 مهر 1391, 20:54 عصر
سلام.
برنامه جالبی رو دیروز دیدم.
وقتی این برنامه نصب میشد ، یه فایل exe داشت.
وقتی ویندوز میومد بالا به عنوان سرویس اجرا میشد و کاربر هم میتونست به صورت یک اپلیکیشن اجراش کنه.
چطوری این فایل دارای ماهیت سرویس و اپلیکشن هست.؟
چطوری همچین برنامه ای میشه نوشت.؟
یعنی برنامه ای که هم به عنوان سرویس باشه و هم به عنوان یه برنامه دارای فرم؟
ممنون از پاسختون.

Felony
پنج شنبه 13 مهر 1391, 21:31 عصر
از کجا میدونی یک فایل بود ؟! از تو پوشش ؟!

استاندارد این برنامه ها این هست که یک سرویس و یک برنامه جدا هستند که باهم تعامل دارند ، مثلا این (http://www.codeproject.com/Articles/24434/How-to-Write-Windows-Service-and-Control-It-By-App) .

میتونی از پارامترها هم استفاده کنی و یک فرم برای سرویس قرار بدی ( تا به حال تست نکردم ولی فکر نمیکنم مشکلی داشته باشه ) .

در کل این نوع پیاده سازی ( پیاده سازی رابط کاربری در یک سرویس ) به هیچ عنوان تائید نمیشه .

Mask
جمعه 14 مهر 1391, 10:57 صبح
از کجا میدونی یک فایل بود ؟! از تو پوشش ؟!
با برنامه Process Explorer میشه مسیر فایل پروسه رو بدست آورد.
وقتی با این برنامه بررسیش کردم. دقیقا یک فایل اجرا بود ، فقط با این تفاوت که در پنجره Properties سرویس در قسمت Command line ، پارامتر ( -service) رو اضافه نسبت به پروسش داره.

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

میتونی از پارامترها هم استفاده کنی و یک فرم برای سرویس قرار بدی ( تا به حال تست نکردم ولی فکر نمیکنم مشکلی داشته باشه )
من فکر میکردم . سرویس و اپلیکیشن کلا از نظر ماهیتی با هم فرق دارند. البته نشد که نداره:چشمک:

در کل این نوع پیاده سازی ( پیاده سازی رابط کاربری در یک سرویس ) به هیچ عنوان تائید نمیشه .
این صحبت طبق چه استدلال و موضوع فنی هست.؟ آیا استاندارد خاصی در رابطه با این موضوع هست.؟

Felony
جمعه 14 مهر 1391, 11:55 صبح
وقتی با این برنامه بررسیش کردم. دقیقا یک فایل اجرا بود ، فقط با این تفاوت که در پنجره Properties سرویس در قسمت Command line ، پارامتر ( -service) رو اضافه نسبت به پروسش داره.

میتونی از پارامترها هم استفاده کنی و یک فرم برای سرویس قرار بدی ( تا به حال تست نکردم ولی فکر نمیکنم مشکلی داشته باشه )


به نظر من برعکس حرف شما ، واقعا جالب و کاربردیه که یک فایل هر دو وجه رو در بر بگیره.
این صحبت طبق چه استدلال و موضوع فنی هست.؟ آیا استاندارد خاصی در رابطه با این موضوع هست.؟
اخوی من حرفی از جالب نبودن و کاربردی نبودن این موضوع نزدم که شما میگی برعکس حرف من جالب و کاربردیه .

این یک موضوع کاملا فنی هست ، قبلا هم بارها تو مقالات مختلف این توصیه رو دیدم ، خلاصه این میشه که اصولا سرویس ها برای این نوشته میشن که یک عملیات رو به صورت مداوم بررسی و انجام بدن و روند پردازشی پروسه ها درشون اختلالی ایجاد نکنه ، برنامه های معمولی که رابط کاربری دارن خیلی راحت ممکنه با شرایط فریز شدن به واسطه رابط کاربری مواجه بشن ، مثلا وقتی یک برنامه داره پردازش سنگینی انجام میده و کاربر سعی داره به واسطه UI برنامه کار دیگه ای درخواست کنه و پروسه برنامه به حالت Not Responding میره و در آخر Process توسط کرنل kill میشه .

اگر سرویسی و برنامه ای که نام بردید 2 کار متفاوت انجام میدن که کنار هم قرار دادنشون چیزی جز نادانی نیست ! اگر هم با هم ارتباط و تعاملی دارن از لحاظ فنی اون کار اشتباه هست و همه جا تائکید شده که رابط کابری رو جدای از سرویس طراحی کنید و با روش های مختلف مثل Message و Memory Mapped Files ها و ... بینشون ارتباط بر قرار کنید ؛ کوچکترین مشکلی تو رابط کاربری اون سرویس ( raise exception یا ... ) میتونه روند اجرای سرویس رو مختل کنه ، مگر اینکه رابط کاربری کار سنگینی انجام نده و سرویس در Thread های جداگانه مدیریت بشه که باز هم دردسرهای خاص خودش رو داره .

در آخر ممکنه اون فایلی که میبینی با پارامتر کار کنه و وقتی فلان پارامتر بهش ارسال میشه سرویس رو اجرا کنه و وقتی پارامتر دیگه بهش ارسال بشه UI برنامه رو اجرا کنه .

Mask
جمعه 14 مهر 1391, 21:24 عصر
اخوی من حرفی از جالب نبودن و کاربردی نبودن این موضوع نزدم که شما میگی برعکس حرف من جالب و کاربردیه .
ممنون از پاسخت.
چون فرمودید

در کل این نوع پیاده سازی ( پیاده سازی رابط کاربری در یک سرویس ) به هیچ عنوان تائید نمیشه .
من حس کردم منظورتون اینه که این کار جالب و کاربردی نیست.
بگزریم:قلب:
در مورد

این یک موضوع کاملا فنی هست ، قبلا هم بارها تو مقالات مختلف این توصیه رو دیدم ، خلاصه این میشه که اصولا سرویس ها برای این نوشته میشن که یک عملیات رو به صورت مداوم بررسی و انجام بدن و روند پردازشی پروسه ها درشون اختلالی ایجاد نکنه ، برنامه های معمولی که رابط کاربری دارن خیلی راحت ممکنه با شرایط فریز شدن به واسطه رابط کاربری مواجه بشن ، مثلا وقتی یک برنامه داره پردازش سنگینی انجام میده و کاربر سعی داره به واسطه UI برنامه کار دیگه ای درخواست کنه و پروسه برنامه به حالت Not Responding میره و در آخر Process توسط کرنل kill میشه .

اگر سرویسی و برنامه ای که نام بردید 2 کار متفاوت انجام میدن که کنار هم قرار دادنشون چیزی جز نادانی نیست ! اگر هم با هم ارتباط و تعاملی دارن از لحاظ فنی اون کار اشتباه هست و همه جا تائکید شده که رابط کابری رو جدای از سرویس طراحی کنید و با روش های مختلف مثل Message و Memory Mapped Files ها و ... بینشون ارتباط بر قرار کنید ؛ کوچکترین مشکلی تو رابط کاربری اون سرویس ( raise exception یا ... ) میتونه روند اجرای سرویس رو مختل کنه ، مگر اینکه رابط کاربری کار سنگینی انجام نده و سرویس در Thread های جداگانه مدیریت بشه که باز هم دردسرهای خاص خودش رو داره .
من این برنامه رو نوشتم. واقعا خوب بود. فقط چون الان با این موضوع درگیر شدم و کلی تست کردم و تجربه کسب کردم، جا داره یه توضیحی بدم:
همه چیز برمیگرده به نوع برنامه نویسی : من در برنامم که کار خیلی سنگین مثل یه While بی انتها رو شروع کردم و با عث فریز شدن برنامه شد . اما هیچ تاثیری بر روی عملکرد سرویس نداشت.

در آخر ممکنه اون فایلی که میبینی 1 فایل نباشه و 2 تا فایل داخلش Embedded شده باشه و وقتی فلان پارامتر بهش ارسال میشه فایل Application روی حافظه یا یک پوشه موقت Extract بشه و اجرا بشه .
لا اقل یا این شاید و ممکنه ها صحبت :

میتونی از پارامترها هم استفاده کنی و یک فرم برای سرویس قرار بدی ( تا به حال تست نکردم ولی فکر نمیکنم مشکلی داشته باشه ) .
رو نقض نکن.
من این برنامه رو نوشتم و نمونه کدش رو هم قرار میدم.

if ParamStr(1)='-Service' then
begin
SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TFree_Time, Free_Time);
SvcMgr.Application.Run;
end
else
begin
Forms.Application.Initialize;
Forms.Application.MainFormOnTaskbar := True;
Forms.Application.CreateForm(TfrmMain, frmMain);
Forms.Application.Run;
end;
اما از اینکه همراهی کردید و راهنمایی ، ازتون ممنونم.

Felony
شنبه 15 مهر 1391, 05:33 صبح
لا اقل یا این شاید و ممکنه ها صحبت :

میتونی از پارامترها هم استفاده کنی و یک فرم برای سرویس قرار بدی ( تا به حال تست نکردم ولی فکر نمیکنم مشکلی داشته باشه ) .
رو نقض نکن.
خسته نباشی !

به اون کدی که نوشتی دقت کن ، من حرف های خودم رو نقض نکردم ، کدی که جناب عالی نوشتی چی کار میکنه ؟ فکر کن بار اول من 2 بار روی فایل کلیک کردم و بدون پارامتر فایل اجرا شد ، خوب چی میشه ؟ یک پروسه برای برنامه ساخته میشه و UI اجرا میشه ؛ حالا بار دوم میام و فایل رو با پارامتر Service- اجرا میکنم حالا چی میشه ؟! یک سرویس جداگانه اجرا میشه ، یعنی به عبارتی 2 پروسه کاملا مستقل از هم ، توقع نداری وقتی یک پروسه ( UI ) برنامت فریز میشه رو اون یکی اثری داشته باشه ؟! مثل این میمونه 2 تا Instance از Photoshop باز کنی و وقتی یکی فریز شد منتظر باشی اون یکی هم فریز بشه !

من فکر همین موضوع رو کردم و قبل از این که شما بگی پیشنهاد دادم از پارامتر استفاده کن که بعدش شما اومدی گفتی این برنامه هم از پارامتر استفاده کرده وگرنه هنوز هم میگم ، پیاده سازی UI و Service در یک پروسه واحد چیزی جز دردسر نیست ، موضوعی هم که من گفتم و شما نمونه کدش رو قرار دادی کاملا متفاوت با مبحثی هست که من راجع بهش توضیح دادم .