View Full Version : اجرا نشدن مجدد برنامه
khoshblagh
سه شنبه 10 آذر 1388, 07:47 صبح
با سلام خدمت دوستان
احتراما در یک برنامه بعد از مینی مایز کردن آن ممکن است که کاربر اشتباها سعی در اجرای برنامه نماید. لذا با کد زیر جلوی اجرای مجدد برنامه را میگیریم. حال اگر در همان حالت مینی مایز برنامه را ببندیم و سعی در اجرای مجدد آن نماییم برنامه اجرا نمیشود و باید سیستم را خاموش و روشن نماییم. به نظر شما مشکل از کجاست و چطور آنرا رفع نماییم؟ متشکرم
var
hmutex:THandle;
begin
hmutex:=CreateMutex(nil,False,'OneCopyMutext');
if WaitForSingleObject(hmutex,0)<>WAIT_TIMEOUT then
begin
Application.Initialize;
Application.Title := 'frmRamz';
Application.CreateForm(TfrmRamz, frmRamz);
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TData, Data);
Application.Run;
end;
K.Mohammadreza
سه شنبه 10 آذر 1388, 07:55 صبح
اين کد را بنويس
Var
fMutex: THandle;
begin
fMutex := CreateMutex(nil, FALSE, @Application.Title[1]);
try
if (GetLastError() = ERROR_ALREADY_EXISTS) or
(WaitForSingleObject(fMutex, 100) = WAIT_TIMEOUT) or
(fMutex = 0) then
begin
Application.Terminate;
end;
finally
ReleaseMutex(fMutex);
end;
alinikaein
سه شنبه 10 آذر 1388, 09:06 صبح
سلام دوست عزيز؛
مشكل شما استفاده از <> هست. شما از = استفاده كنيد و دستورات را برعكس كنيد. يعني مثل زير:
HMutex := CreateMutex(nil, False, 'SamanOneCopyMutex');
if WaitForSingleObject(HMutex, 0) = WAIT_TIMEOUT then
begin
Exit;
end;
يا علي... موفق باشيد...
khoshblagh
سه شنبه 10 آذر 1388, 14:52 عصر
اين کد را بنويس
Var
fMutex: THandle;
begin
fMutex := CreateMutex(nil, FALSE, @Application.Title[1]);
try
if (GetLastError() = ERROR_ALREADY_EXISTS) or
(WaitForSingleObject(fMutex, 100) = WAIT_TIMEOUT) or
(fMutex = 0) then
begin
Application.Terminate;
end;
finally
ReleaseMutex(fMutex);
end;
با تشکر از شما آیا کد بالا را جایگزین کد برنامه خودم بنمایم ؟
khoshblagh
سه شنبه 10 آذر 1388, 14:54 عصر
سلام دوست عزيز؛
مشكل شما استفاده از <> هست. شما از = استفاده كنيد و دستورات را برعكس كنيد. يعني مثل زير:
HMutex := CreateMutex(nil, False, 'SamanOneCopyMutex');
if WaitForSingleObject(HMutex, 0) = WAIT_TIMEOUT then
begin
Exit;
end;
يا علي... موفق باشيد...
با تشکر . آیا این کد جایگزین کد قبلی گردد؟
K.Mohammadreza
سه شنبه 10 آذر 1388, 16:31 عصر
با تشکر از شما آیا کد بالا را جایگزین کد برنامه خودم بنمایم ؟
بله کافيه کد را جايگزين کنيد
البته به جاي اين کدها
hmutex:THandle;
begin
hmutex:=CreateMutex(nil,False,'OneCopyMutext');
if WaitForSingleObject(hmutex,0)<>WAIT_TIMEOUT then
begin
khoshblagh
دوشنبه 16 آذر 1388, 06:52 صبح
اين کد را بنويس
Var
fMutex: THandle;
begin
fMutex := CreateMutex(nil, FALSE, @Application.Title[1]);
try
if (GetLastError() = ERROR_ALREADY_EXISTS) or
(WaitForSingleObject(fMutex, 100) = WAIT_TIMEOUT) or
(fMutex = 0) then
begin
Application.Terminate;
end;
finally
ReleaseMutex(fMutex);
end;
با سلام
میشه در باره این بخش توضیح مختصری بدهید. متشکرم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.