View Full Version : اجرا نشدن مجدد برنامه
  
khoshblagh
سه شنبه 10 آذر 1388, 08: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, 08: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, 10:06 صبح
سلام دوست عزيز؛
مشكل شما استفاده از <> هست. شما از = استفاده كنيد و دستورات را برعكس كنيد. يعني مثل زير:
  HMutex := CreateMutex(nil, False, 'SamanOneCopyMutex');
  if WaitForSingleObject(HMutex, 0) = WAIT_TIMEOUT then
  begin
    Exit;
  end;
يا علي... موفق باشيد...
khoshblagh
سه شنبه 10 آذر 1388, 15: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, 15:54 عصر
سلام دوست عزيز؛
 
مشكل شما استفاده از <> هست. شما از = استفاده كنيد و دستورات را برعكس كنيد. يعني مثل زير:
 
 HMutex := CreateMutex(nil, False, 'SamanOneCopyMutex');
if WaitForSingleObject(HMutex, 0) = WAIT_TIMEOUT then
begin
Exit;
end;
يا علي... موفق باشيد...
با تشکر . آیا این کد جایگزین کد قبلی گردد؟
K.Mohammadreza
سه شنبه 10 آذر 1388, 17:31 عصر
با تشکر از شما آیا کد بالا را جایگزین کد برنامه خودم بنمایم ؟
بله کافيه کد را جايگزين کنيد
البته به جاي اين کدها
  hmutex:THandle;
  begin
    hmutex:=CreateMutex(nil,False,'OneCopyMutext');
    if WaitForSingleObject(hmutex,0)<>WAIT_TIMEOUT then
      begin
khoshblagh
دوشنبه 16 آذر 1388, 07: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.