1. 程式人生 > >delphi 只允許執行一個例項的三種方法轉

delphi 只允許執行一個例項的三種方法轉

讓程式只執行一個例項

Windows 下一個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠執行一個例項。在Delphi程式設計中,筆者總結出了以下幾種方法:
  一、 查詢視窗法
  這是最為簡單的一種方法。在程式執行前用FindWindow函式查詢具有相同視窗類名和標題的視窗,如果找到了,就說明已經存在一個例項。在專案原始檔的初始化部分新增以下程式碼:
  Program OneApp
  Uses
  Forms,Windows;(這裡介紹的幾種方法均需在專案原始檔中新增Windows單元,以後不再重複了)
  Var Hwnd:Thandle;
  Begin
   Hwnd:=FindWindow(‘TForm1’,‘SingleApp’);
   If Hwnd=0 then
   Begin
   Application.Initialize;
   Application.CreateForm(Tform1, Form1);
   Application.Run;
   End;
  End;
  FindWindow()函式帶兩個引數,其中的一個引數可以忽略,但筆者強烈建議將兩個引數都用上,免得湊巧別的程式也在使用相同的類名,就得不到正確的結果了。另外,如果是在Delphi IDE視窗中執行該程式,將一次都不能執行,因為已經存在相同類名和標題的視窗:設計時的窗體。
  二、使用互斥物件
  如果覺得查詢視窗的方法效率不太高的話,可以使用建立互斥物件的方法。儘管互斥物件通常用於同步連線,但用在這個地方也是非常方便的。僅用了4句程式碼就輕鬆搞定。
  VAR Mutex:THandle;
  begin
   Mutex:=CreateMutex(NIL,True,‘SingleApp’);
   IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一例項
   BEGIN
   Application.CreateHandle;
   Application.CreateForm (TExpNoteForm, ExpNoteForm);
   Application.Run;
   END;
   ReleaseMutex(Mutex);
  end.
  三、全域性原子法
  我們也可以利用向系統新增全域性原子的方法,來防止多個程式例項的執行。全域性原子由Windows 系統負責維持,它能保證其中的每個原子都是唯一的,管理其引用計數,並且當該全域性原子的引用計數為0時,從記憶體中清除。我們用GlobalAddAtom 函式向全域性原子新增一個255個位元組以內的字串,用GlobalFindAtom來檢查是否已經存在該全域性原子,最後在程式結束時用GlobalDeleteAtom函式刪除新增的全域性原子。示例如下:
  Uses Windows
  const iAtom=‘SingleApp’;
  begin
   if GlobalFindAtom(iAtom)=0 then
   begin
   GlobalAddAtom(iAtom);
   Application.Initialize;
   Application.CreateForm(TForm1,Form1);
   Application.Run;
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   end
   else
   MessageBox(0,‘You can not run a second copy of this App’,‘’,mb_OK);
  end.
  利用全域性原子的引用計數規則,我們還可以判斷當前共運行了該程式的多少個例項:
  var i:Integer;
  begin
   I:=0;
  while GlobalFindAtom(iAtom)<>0 do
   begin
   GlobalDeleteAtom(GlobalFindAtom(iAtom));
   i:=i+1;
   end;
   ShowMessage(IntToStr(I));
  end;
  以上幾種方法在筆者的Delphi 4.0,中文Windows95下通過。

相關推薦

delphi 允許執行一個例項方法

讓程式只執行一個例項 Windows 下一個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠執行一個例項。在Delp

delphi允許執行一個例項

"delphi 只允許執行一個例項的三種方法轉": 一、建立互斥物件 在工程project1.dpr中建立互斥物件 program project1 uses windows,form, frmmain in 'frmmain.pas' {mainform};

C#應用程式允許執行一個例項,多次執行的時候啟用當前例項,顯示其介面

  很多時候,我們開發的程式,需要單例執行的的功能,即整個應用程式只允許同時執行最多一個例項,重複執行的時候,啟用當前實力,顯示其介面。   在C#程式中,其解決方案有多重,可以參照Charles Chen 的C#程式只允許執行一個例項的解決方案一文。   

允許執行一個例項方法

查詢視窗法 TCHAR wndName = ["blahblah"]; hWnd = FindWindow(NULL, wndName); if(hwnd == 0) // 沒找到,就是沒執

PHP設定指令碼最大執行時間的方法

PHP設定指令碼最大執行時間的三種方法 php.ini 中預設的最長執行時間是 30 秒,這是由 php.ini 中的 max_execution_time 變數指定,如果指令碼需要跑很長時間 這種情況就要更改php指令碼

java 建立執行緒的方法

在java中使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項,建立執行緒有三種方式: 1.通過繼承Thread類建立執行緒; 2.通過實現Runnable介面建立執行緒; 3.通過使用Callable和Future建立執行緒。 建立執行緒demo

執行緒及建立執行緒的方法

基本概念 程式:是為了完成特定任務,用某種語言編寫的一組指令的集合.即指一段靜態程式碼。 程序:程序是程式的一次執行過程,是系統進行資源分配和處理機排程的一個獨立單位。 程式是一個靜態的概念,程序是一個動態的概念。一個程式多次執行,對應多個程序;不同的程序可以包含同一程式。 執行緒:

Java基礎-建立執行緒的方法

1.繼承Thread類 1)定義Thread類的子類,並重寫run方法,run方法就是執行緒要執行的任務,將其稱為執行體。 2)建立Thread類子類的物件,即建立了執行緒物件。 3)呼叫執行緒物件的start()方法來啟動該執行緒。 此方法需要覆蓋掉其中的run()方法。 1 public

Unity之C#——非同步委託開啟執行緒,方法檢測結束

Unity之C#——非同步委託開啟執行緒,三種方法檢測結束 原始碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

Java——實現Java多執行緒的方法

Java虛擬機器允許應用程式併發地執行多個執行緒。在Java語言中,多執行緒的實現一般有以下3種方法,其中前兩種是最常用的方法。 1.繼承Thread類,重寫run()方法 Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項。並且,啟動執行緒的唯一方法就是通過

java中建立執行緒的方法以及區別

Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示: 1)繼承Thread類建立執行緒 2)實現Runnable介面建立執行緒 3)使用Callable和Future建立執行緒 下面

終止執行緒的方法

 有三種方法可以使終止執行緒。    1.  使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。    2.  使用stop方法強行終止執行緒(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。    3.  使

頁面載入即執行JQuery的方法

【1】$(function( ){ }); $(function(){   $("#name").click(function(){     //adding your code here

Java終止執行緒的方法

使用標誌位退出執行緒 使用stop方法強制終止執行緒 使用interrupt終止執行緒 1. 使用標誌位退出執行緒 這種也是最常用的方法,就是定義一個boolean型的標誌位,線上程的run方法中根據這個標誌位是true還是false來判斷是否退出,這種

Java建立多執行緒的方法

Java多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。1、繼承Thread類實現多執行緒

【iOS沉思錄】iOS子執行緒更新UI到主執行緒的方法

簡單說將程式碼同步到主執行緒執行的三種方法如下: // 1.NSThread [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

停止執行緒的方法

在Java中有以下3種方法可以終止正在執行的執行緒: 1. 拋異常法; 2. 使用stop方法強行終止執行緒 3. 使用interrupt方法中斷執行緒 下面分別對它們進行介紹: 一、拋異常法 拋異常法:顧名思義就是通過丟擲一個異常,然後

c++11多執行緒程式設計(一):建立執行緒的方法

c++11執行緒庫原始的c++標準僅支援單執行緒程式設計,新的c++標準(c++11或c++0x)於2011年釋出,引入了新的執行緒庫。 編譯器要求 Linux: gcc 4.8.1 (完全併發支援) Windows: Visual Studio 2012 and Min

《Java多執行緒面試題》系列-建立執行緒的方法及其區別

1. 建立執行緒的三種方法及其區別 1.1 繼承Thread類 首先,定義Thread類的子類並重寫run()方法: package com.zwwhnly.springbootaction.javabase.thread; public class MyFirstThread extends Thread

測試函式執行時間的8方法——

目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.