Советы по Delphi. Версия 1.4.3 от 1.1.2001 - [9]

Шрифт
Интервал

>Unit OneInstance32;


>interface


>implementation


>uses

> Forms;


>var

> g_hAppMutex: THandle;


>function OneInstance: boolean;

>var

> g_hAppCritSecMutex: THandle;

> dw: Longint;

>begin

> g_hAppCritSecMutex := CreateMutex(nil, true, PChar(Application.Title + '.OneInstance32.CriticalSection'));

> // if GetLastError - лениво писать

> g_hAppMutex := CreateMutex(nil, false, PChar(Application.Title + 'OneInstance32.Default'));

> dw := WaitForSingleObject(g_hAppMutex, 0);

> Result := (dw <> WAIT_TIMEOUT);

> ReleaseMutex(g_hAppCritSecMutex); // необязательно вследствие последующего закрытия

> CloseHandle(g_hAppCritSecMutex);

>end;


>initialization

> g_hAppMutex := 0;


>finalization

> if LongBool(g_hAppMutex)  then begin

>  ReleaseMutex(g_hAppMutex); // необязательно

>  CloseHandle(g_hAppMutex);

> end;


>end.

Как не допустить запуск второй копии программы XI

Михаил Чумак рекомендует следующий код:

Есть такая штука Atom (см. Help).

>program SelfCheck;


>uses

> Windows,Forms,Unit1 in 'Unit1.pas' {Form1};


>const

> AtStr='MyProgram';


>function CheckThis : boolean;

>var

> Atom: THandle;

>begin

> Atom:= GlobalFindAtom(AtStr);

> Result:= Atom <> 0;

if not result then GlobalAddAtom(AtStr);

>end;


>begin

> if not CheckThis then begin

> // Запуск программмы

>  Application.Initialize;

>  Application.CreateForm(TForm1, Form1);

>  Application.Run;

>  GlobalDeleteAtom(GlobalFindAtom(AtStr));

>  // !!!

end

> else begin

>MessageBox(0,'Нельзя запустить две копии','Моя программа',0);

end;

>end.

Элегантно и работает однозначно. Спасибо Славе Шубину.

Как не допустить запуск второй копии программы XII

Nomadic рекомендует следующее:

A: Воспользуйтесь функцией ActivatePrevInstance из библиотеки rxLib. Для завершения второго экземпляра используйте Application.Terminate.

(AS): Другой вариант: X:\DELPHI2\DEMOS\IPCDEMOS\ipcthrd.pas, функция IsMonitorRunning().

Как правильно завершить некое приложение?

Nomadic рекомендует следующий код:

Если не принудительно, то можно послать на его Instance сообщение WM_QUIT. Если же необходимо принудительно терминировать приложение, то смотрите ниже — под Windows NT процесс можно терминировать через специально предназначенный для этого хэндл. Иначе гарантии нет. Предположим, что процесс создаем мы, ожидая его завершения в течение maxworktime. Тогда —

>var

> dwResult: Longint; // This example was converted from C source.

>begin

>// Not tested. Some 'nil' assignments must be applied

> // as zero assignments in Pascal. Some vars need to

> // be declared (maxworktime, si, pi). AA.

if CreateProcess(nil, CmdStr, nil, nil, FALSE,CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin

>  CloseHandle(pi.hThread);

>  dwResult := WaitForSingleObject(pi.hProcess, maxworktime*1000*60);

>  CloseHandle(pi.hProcess);

if dwResult <> WAIT_OBJECT_0 then begin

>   pi.hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId);

>   if pi.hProcess <> nil then begin

>     TerminateProcess(pi.hProcess, 0);

>     CloseHandle(pi.hProcess);

>   end;

end;

end;

>end;

Как отчитывать промежутки времени с точностью, большей чем 60 мсек?

Nomadic рекомендует следующий код:

Для начала описываешь процедуру, которая будет вызываться по сообщению от таймера :

>procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD); stdcall;

>begin

> //// Тело процедуры.

>end;

а дальше в программе (например по нажатию кнопки) создаешь Таймер и вешаешь на него созданную процедуру

> uTimerID:=timeSetEvent(10, 500, @FNTimeCallBack, 100, TIME_PERIODIC);

Подробности смотри в Help. Hу и в конце убиваешь таймер

>timeKillEvent(uTimerID);

И все. Точность этого способа до 1 мсек. минимальный интервал времени можно задавать 1 мсек.

Обратите внимание на то, что все CALLBACK-функции, вызываемые Windows, должны использовать соглашение о вызовах stdcall.

Как сделать чтобы при событиях моя программа отпpавляла кому-либо сообщение на мой компьютеp?

Nomadic рекомендует следующий код:

Если только послать, то проще всего, пожалуй…

W32: F1 «NetMessageBufferSend»;

Win16: Почему-то не описан, но руками наковырял…

>function NetMessageBufferSend(Zero1, Zero2: Word; WhoTo: PChar; Buffer: PChar; BufSize: Word): Integer; external 'netapi' index 525;

«Кому» может быть '*' == всем.

Что нужно давать WSAAsyncSelect в качестве параметра handle, если тот запускается и используется в dll (init), и никакой формы (у которой можно было бы взять этот handle) в этой dll не создается?

Nomadic рекомендует следующий код:

>const WM_ASYNCSELECT = WM_USER+0;

>type TNetConnectionsManager = class(tobject)

>protected

> FWndHandle : HWND;

>procedure WndProc(var MsgRec : TMessage);

> …

>end;


>constructor TNetConnectionsManager.Create

>begin

> inherited Create;

> FWndHandle := AllocateHWnd(WndProc);

> …

>end;


>destructor TNetConnectionsManager.Destroy;

>begin

> …

> if FWndHandle<>0 then DeallocateHWnd(FWndHandle);

> inherited Destroy;

>end;


>procedure TNetConnectionsManeger.WndProc(var MsgRec : TMessage);

>begin

> with MsgRec do

>  if Msg = WM_ASYNCSELECT then WMAsyncSelect(MsgRec)

>  else DefWindowProc(FWndHandle, Msg, wParam, lParam);

>end;

Hо pекомендую посмотpеть WinSock2, в котоpом можно:

>WSAEventSelect(FSocket, FEventHandle, FD_READ or fd_close);

>WSAWaitForMultipleEvents();

>WSAEnumNetworkEvents(FSocket, FEventHandle, lpNetWorkEvents);


Еще от автора Валентин Озеров
Советы по Delphi. Версия 1.0.6

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.