Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизКак узнать, не запущена ли программа? Найти похожие ветки
← →
Morrison © (2005-03-02 23:30) [0]Ламерский вопрос, который наверняка задавался неоднократно... Надо чтобы при попытке повторно запустить уже работающую программу, эта программа бы не запускалась... В общем, как отследить, работает ли программа в данный момент?
← →
Anatoly Podgoretsky © (2005-03-02 23:33) [1]Общими средствами никак, да и зачем ну запустилась, обнаружижила что она не единственная, так и прекратить безобразие, тих уйти.
Для обнаружения желательно использовать мьютексы.
← →
P.N.P. © (2005-03-02 23:34) [2]>наверняка задавался неоднократно
А почему, исходя из этого предположения, в FAQ не заглянуть?
← →
Новичек © (2005-03-02 23:35) [3]http://delphibase.spb.ru/
← →
Simply Alex (2005-03-02 23:51) [4]Добавь в файл проекта:
var
HM: THandle;
function IsRunning: Boolean;
begin
HM:=OpenMutex(MUTEX_ALL_ACCESS, false, "SomeName");
Result:=(HM <> 0);
if (HM=0) then HM:=CreateMutex(nil, false, "SomeName")
end;
Если твоя программа запущена, то IsRunning=TRUE...
← →
Morrison © (2005-03-03 00:09) [5]Большое спасибо!
А где можно подробно почитать обо всем этом (всякие там THandle), желательно на русском?
← →
BillyJeans (2005-03-03 13:28) [6]2 Simply Alex (02.03.05 23:51) [4]
а если программа была запущена и некорректно завершена её работа, mutex то останется
← →
Anatoly Podgoretsky © (2005-03-03 14:09) [7]BillyJeans (03.03.05 13:28) [6]
The system closes the handle automatically when the process terminates.
← →
Digitman © (2005-03-03 14:28) [8]
> BillyJeans (03.03.05 13:28) [6]
пурга.
← →
Думкин © (2005-03-03 14:33) [9]> [8] Digitman © (03.03.05 14:28)
Дафай опять свой код с пайпами. :)
← →
Digitman © (2005-03-03 14:36) [10]
> Думкин © (03.03.05 14:33) [9]
щас)
я что, издательство "Сделай сам" для самоделкиных ?)
← →
Вариант © (2005-03-03 16:02) [11]>Simply Alex
Я тоже советую использовать Mutex базирование. Но эффективнее его использовать так:
Добавляем в проект unit:unit Only_One;
interface
function Init_Mutex(mid: string): boolean;
implementation
uses Windows;
var
mut: thandle;
function mut_id(s: string): string;
var
f: integer;
begin
result := s;
for f := 1 to length(s) do
if result[f] = "\" then
result[f] := "_";
end;
function Init_Mutex(mid: string): boolean;
begin
Mut := CreateMutex(nil, false, pchar(mut_id(mid)));
Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
end;
initialization
mut := 0;
finalization
if mut <> 0 then
CloseHandle(mut);
end.
А использвать так:program VariantProgram;
uses
only_one,
Unit1 in "Unit1.pas" {Form1},
Unit2 in "Unit2.pas" {dm: TDataModule},
Unit3 in "Unit3.pas" {Form3},
{$R *.RES}
const
UniqueString = "VariantMutex";
{Может быть любое слово. Желательно латинскими буквами.}
begin
if not init_mutex(UniqueString) then
exit; {Выходим до инициализации, если мьютекс уже есть}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(Tdm, dm);
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
Эффективно на 100%. Я сам использую этот метод.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c