PDA

View Full Version : من برنامه ام در حال اجراست حالا نمی خواهم یه بار دیگه اجرا بشه



محسن شمس
یک شنبه 15 آبان 1384, 10:02 صبح
منظورم اینه که اگر کاربر برنامه ام را اجرا کرد و از قبل هم این برنامه در حال اجرا بود پیغام بدهد و نگذارد اجرا شود

Touska
یک شنبه 15 آبان 1384, 11:11 صبح
می تونی از یک کامپوننت در lmd استفاده کنید.

محسن شمس
یک شنبه 15 آبان 1384, 11:13 صبح
قربان یه ذره بیشتر توضیح بده

Touska
یک شنبه 15 آبان 1384, 11:24 صبح
اگر کامپوننت های Lmd رو داشته باشی مشکلت حله

http://www.lmd.de/products/

mzjahromi
یک شنبه 15 آبان 1384, 11:27 صبح
من یه کامپوننت Just One هم دیدم همین کار رو می کرد

محمد میرمصطفی
یک شنبه 15 آبان 1384, 22:59 عصر
1- یه object تو ویندوز هست به نام mutex که هر برنامه فقط می‏تونه با text مورد نظرش فقط و فقط یه باز ازش instance بگیره. اگه یه instance همنام text مورد نظر شما تو سیستم وجود داشته باشه، برای بار دوم ایجاد نمی شه. می تونی تو برنامه این کارو بکنی. اگه ساخته شد، دفعه اوله اگه پس برنامه قبلا یه بار اجرا شده.
2- به محض اجرای برنامه، موقتا Caption فرم اصلی برنامه رو rename کن. بعد FindWindow کن یا Caption اصلی. اگه پیدا شد، برنامه در دفعه دوم اجراست.

هر دو را 100% تست شده و عملیه

babak869
یک شنبه 15 آبان 1384, 23:47 عصر
با گذاشتن این کامپوننت روی فرم از اجرای مجدد برنامه در حال اجرا جلوگیری خواهد کرد

someCoder
یک شنبه 15 آبان 1384, 23:53 عصر
1- یه object تو ویندوز هست به نام mutex که هر برنامه فقط می‏تونه با text مورد نظرش فقط و فقط یه باز ازش instance بگیره. اگه یه instance همنام text مورد نظر شما تو سیستم وجود داشته باشه، برای بار دوم ایجاد نمی شه. می تونی تو برنامه این کارو بکنی. اگه ساخته شد، دفعه اوله اگه پس برنامه قبلا یه بار اجرا شده.
2- به محض اجرای برنامه، موقتا Caption فرم اصلی برنامه رو rename کن. بعد FindWindow کن یا Caption اصلی. اگه پیدا شد، برنامه در دفعه دوم اجراست.

هر دو را 100% تست شده و عملیه
جالب بود، مرسی

Hamid_PaK
دوشنبه 16 آبان 1384, 05:49 صبح
یه راه سادش این هست که mutex بشه که تابع به این صورت است


function isInstance:Boolean;
var
_Handle:THandle;
begin
_Handle := CreateMutex(nil,True,'miMutexCopy PARS-DESIGN');
Result := False;
if not (WaitForSingleObject(_Handle,0)<>WAIT_TIMEOUT) then
Result := True;
end;


و یک راه دیگه که این روش کامل هست یک یونیت هست با نام CheckPrevious.pas و یک تابع داره با نام


function RestoreIfRunning( const AppHandle : THandle; MaxInstances : integer = 1) : boolean;

که بااون می تونید تعداد اجرا شدن برنامه رو هم تعیین کنید و در صورت اجرا بودن برنامه اون رو به حالت اکتیو برسونید ...

فایل رو ضمیمه می کنم ، یا حق ...

Dolphin
دوشنبه 16 آبان 1384, 11:41 صبح
بابا ایول

اگه ممکنه در مورد mutex کمی توضیح عملی تر بفرمائید و کاربرد اون در چه جاهایی می تونه باشه ؟
ممنون

ali_firouz_ir
دوشنبه 16 آبان 1384, 11:49 صبح
بابا تا اونجا که ما بلدیم لیست پروسس ها در کلاس پروسس هست ببین که تو لیست که نبودی بیابالا

mzjahromi
دوشنبه 16 آبان 1384, 11:52 صبح
ولی مشکل Mutex اینه که اگه دو تا کاربر مختلف ایجادشون کنن میشه.
اگه راه حلی برای این دارید لطف کنین بگین. ممنون می شم

سید مسعود موحد
دوشنبه 16 آبان 1384, 14:17 عصر
دوست عزیز
این لینک را یک نگاهی بینداز
http://www.delphi3000.com/articles/article_2724.asp?SK=

ماریا وکیلی
سه شنبه 17 آبان 1384, 21:27 عصر
کامپونت آقای بابک موقع اجرا خطا می دهد

babak869
سه شنبه 17 آبان 1384, 21:40 عصر
ورژن دلفی شما چیه؟ این کامپوننت برای دلفی 7 هستش و هیچ مشکلی نداره چون من همیشه توی برنامه هام ازش استفاده می کنم.احتمالا مشکل از نصب شماست
موفق باشید

محمد میرمصطفی
چهارشنبه 18 آبان 1384, 23:56 عصر
A mutex object is a synchronization object whose state is set to signaled when it is not owned by any thread, and nonsignaled when it is owned. Only one thread at a time can own a mutex object, whose name comes from the fact that it is useful in coordinating mutually exclusive access to a shared resource. For example, to prevent two threads from writing to shared memory at the same time, each thread waits for ownership of a mutex object before executing the code that accesses the memory. After writing to the shared memory, the thread releases the mutex object.


منبع : MSDN

ماریا وکیلی
پنج شنبه 19 آبان 1384, 10:02 صبح
بالاخره کار کرد

دست شما درد نکنه

مرسی

sorrowdancer
دوشنبه 12 شهریور 1386, 15:50 عصر
با گذاشتن این کامپوننت روی فرم از اجرای مجدد برنامه در حال اجرا جلوگیری خواهد کرد

با تشکر از آقا بابک کامپوننت جالبی بود

ولی جالب تر از اون فایل exe بود که در کنار کامپوننت قرار داشت و در مورد کامپوننت توضیح می داد

قالب فرم بسیار جالب بود!!. این با دلفی ساخته شده؟ چجوری؟!!

Valadi
دوشنبه 12 شهریور 1386, 21:49 عصر
فکر کنم بهترین راه و مطمئن ترین راه باید از registry باید استفاده کنی

در مورد registry در سایت سرچ کن

sorrowdancer
دوشنبه 12 شهریور 1386, 23:44 عصر
فکر کنم بهترین راه و مطمئن ترین راه باید از registry باید استفاده کنی
در مورد registry در سایت سرچ کن


!!
منظورتون رو نفهمیدم

اون یک کامپوننت Themes زیبا بود که بعنوان فرم استفاده شده بود و واقعاً ارتباطش با رجیستری نمیدونم چیه؟!!!!!:متفکر:

mzjahromi
سه شنبه 13 شهریور 1386, 06:43 صبح
@19
اگر کسی جواب سوال رو بلد نیست الزامی به جواب دادن نیست

persianboy
سه شنبه 13 شهریور 1386, 12:39 عصر
http://barnamenevis.org/forum/attachment.php?attachmentid=10228&d=1186842201

sorrowdancer
پنج شنبه 15 شهریور 1386, 18:22 عصر
من نمیدونستم میشه قالب فرم رو عوض کرد
و دنبالش گشتم تا فهمیدم که باید از VCL Skin ها استفاده کنم و کلی VCL دانلود کردم

از آقا بابک هم به خاطر این کامپوننت که موجب میشه دوبار برنامه ران نشه و هم اون فایل توضیحی (http://barnamenevis.org/forum/attachment.php?attachmentid=1325&d=1131310043) که تو آتاچ قرار دادند و موجب یک انقلاب در برنامه هام شد سپاسگزارم

سيد مجتبي هاشمي
سه شنبه 19 آذر 1387, 11:25 صبح
[quote=Touska;160309]اگر کامپوننت های Lmd رو داشته باشی مشکلت حله

میشه در مورد کامپوننت های Lmd توضیح بدی؟ ممنون میشم.

سيد مجتبي هاشمي
سه شنبه 19 آذر 1387, 11:29 صبح
با گذاشتن این کامپوننت روی فرم از اجرای مجدد برنامه در حال اجرا جلوگیری خواهد کرد


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

matinebi
سه شنبه 19 آذر 1387, 18:37 عصر
دوست عزیز لینکی که قرار دادید کلی لینک دانلود داره با کامپوننت های مختلف کدوم یکی از اون هاست لطفا لینک دانلود قرار دهید به جای سایت

Mask
سه شنبه 19 آذر 1387, 19:02 عصر
با اجازه اساتید
چند روش هست
یکی اینکه برنامه در هر بار اجرا چک کنه که نام پروسه خودش در حال اجرا هست یا نه که اگه بود دیگه اجرا نشه.
یکی دیگه وقتی برنامه اجرا میشه یک فایل در محلی ساخته بشه و با هر بار اجرای برنامه وجود فایل چک بشه

ahmadr
سه شنبه 19 آذر 1387, 20:46 عصر
می تونی از یکی از کامپوننتهای رایگان JVCL بنام JvAppInstances که در تب JV SYSTEM قرار دارد استفاده کنی. فقط کافیه اونو روی فرم بندازی بعد تمام. حتی توی این کامپوننت میتونی تعیین کنی برنامه ات چند بار اجرا بشه.
http://sourceforge.net/projects/jvcl

matinebi
شنبه 30 آذر 1387, 10:04 صبح
چطور باید از کامپوننت 1 Time Exe استفاده کرد

matinebi
شنبه 30 آذر 1387, 10:22 صبح
component\install component\info new package\
انتخاب یونیت و یک نام دلخواه در نهایت هم قرار دادن کامپوننت روی فرم

سيد مجتبي هاشمي
شنبه 15 فروردین 1388, 23:55 عصر
با گذاشتن این کامپوننت روی فرم از اجرای مجدد برنامه در حال اجرا جلوگیری خواهد کرد

ممنون از كامپوننت خوبي كه گذاشته بودين. اما يه مشكل داره و اون هم اينكه پس از نصب پيغام خطاي زير رو ميده. (لطفا عكس رو ببينيد يعني فايل error.rar)

sarbandi
یک شنبه 16 فروردین 1388, 15:26 عصر
با سلام بهتر از hwnd
استفاده کرد
روش استفاده از یک Timer و هندل
یک تایمر در فرم اصلی قرار دهید
و Interval آن را 100 قرار دهید بعد بر روی تایمر قطعه کد زیر را بنویسد



;(procedure TForm1.Timer1Timer(Sender: TObject
var
T: hwnd;
Begin
T:=FindWindow (nil,'...فرم اصلي');
If (t<>form1.Handle) then
SendMessage (t, WM_CLOSE, 0, 0);
end;
29681

این همه برنامه با اجراش
29682

sarbandi
یک شنبه 16 فروردین 1388, 15:29 عصر
البته به جای فرم اصلی...
نام فرم اصلی یا main from برنامه خود را قرار دهید
این قطعه کد برنامه ای که caption فرم ان با نام فرم اصلی یکی باشد به صورت اتوماتیک می بندد

sarbandi
یک شنبه 16 فروردین 1388, 15:31 عصر
البته به جای فرم اصلی در
قسمت
T:=FindWindow (nil,'...فرم اصلي');

نام فرم اصلی برنامه خود را قرار دهید
این قطعه کد نام برنامه ای که با برنامه شما یکی باشد را اتوماتیک می بنند

و خود برنامه را نمی ببند
چون خود برنامه باید در حال اجرا باشد
و فقط یکبار برنامه شما اجرا می شود
و هر بار دیگر اجرا شود به صورت اتوماتیک با این قطعه کد بسته می شود

سيد مجتبي هاشمي
دوشنبه 17 فروردین 1388, 10:23 صبح
با سلام بهتر از hwnd
استفاده کرد
روش استفاده از یک Timer و هندل
یک تایمر در فرم اصلی قرار دهید
و Interval آن را 100 قرار دهید بعد بر روی تایمر قطعه کد زیر را بنویسد



;(procedure TForm1.Timer1Timer(Sender: TObject
var
T: hwnd;
Begin
T:=FindWindow (nil,'...فرم اصلي');
If (t<>form1.Handle) then
SendMessage (t, WM_CLOSE, 0, 0);
end;
29681

این همه برنامه با اجراش
29682


ممنون از كدي كه نوشتين. اما اگه لطف كنيد و كدهايي رو كه ميخواين بنويسين بين دوتا # قرار بدين كه درست نمايش داده بشه خيلي بهتره. همينطور اگه تورفتگي رو در كدنويسي رعايت كنيد مانند كد زير:



procedure TForm1.Timer1Timer(Sender: TObject);
var
T : hwnd;
Begin
T := FindWindow (nil,'...فرم اصلي');
If (t<>form1.Handle) then
SendMessage (t, WM_CLOSE, 0, 0);
end;

سيد مجتبي هاشمي
سه شنبه 18 فروردین 1388, 23:19 عصر
با گذاشتن این کامپوننت روی فرم از اجرای مجدد برنامه در حال اجرا جلوگیری خواهد کرد

آقاي بابك869 نميخواي بگي اين مشكل كه تو كامپوننتت هست چيه و چه طوري ميشه حلش كرد؟

سيد مجتبي هاشمي
چهارشنبه 02 اردیبهشت 1388, 15:42 عصر
آقاي Babak869 جواب نميدين؟