Разные вопросы
Code: |
{Act: 0 - Очистка атомов, 1 - чтение атомов, 2 - запись атомов} {Uniq - Уникальный идентификатор} {AtomNfo - Информация для записи} Function AtomDo(Act:integer;Uniq,AtomNfo:string);
Procedure CleanAtoms; var P:PChar; i:Word; begin GetMem(p, 256); For i:=0 to $FFFF do begin GlobalGetAtomName(i, p, 255); if StrPos(p, PChar(Uniq))<>nil then GlobalDeleteAtom(i); end; FreeMem(p); end;
Function ReadAtom:string; var P:PChar; i:Word; begin GetMem(p, 256); For i:=0 to $FFFF do begin GlobalGetAtomName(i, p, 255); if StrPos(p, PChar(Uniq))<>nil then break; end; result:=StrPas(p+length(Uniq)); FreeMem(p); end;
begin
case Act of 0 : CleanAtoms; 1 : Result:=ReadAtom; 2 : begin CleanAtoms; GlobalAddAtom(PChar(Uniq+AtomNfo)); end; end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Code: |
function LastInput: DWord; var LInput: TLastInputInfo; begin LInput.cbSize := SizeOf(TLastInputInfo); GetLastInputInfo(LInput); Result := GetTickCount - LInput.dwTime; end;
//Example: procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := Format('System Idle since %d ms', [LastInput]); end;
// The GetLastInputInfo function retrieves the time // of the last input event. // Minimum operating systems: Windows 2000 |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Ниже приведены два примера, которые при создании потоков позволяют обойтись без класса TThread, используя API функции CreateThread, SuspendThread, ResumeThread и TerminateThread.
Пример 1:
Поместите на форму 2 окошка редактирования (edit) и 6 кнопок. Далее приведён сам код:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Code: |
{$IFNDEF WIN32} const WF_WINNT = $4000; {$ENDIF}
function IsNT : bool; {$IFDEF WIN32} var osv : TOSVERSIONINFO; {$ENDIF} begin result := true; {$IFDEF WIN32} GetVersionEx(osv); if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then exit; {$ELSE} if ((GetWinFlags and WF_WINNT) = WF_WINNT ) then exit; {$ENDIF} result := false; end;
procedure TForm1.Button1Click(Sender: TObject); begin if IsNt then ShowMessage('Running on NT') else ShowMessage('Not Running on NT'); end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Автор: Gert v.d. Venis
Описание:
Данный компонент получает хэндл(handle) любого запущенного окна и даёт возможность отправить по указанному хэндлу любые комбинации нажатия клавиш.
Совместимость: Все версии Delphi
Компонент Sendkeys:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Первый способ:
Code: |
uses Windows, SysUtils;
procedure DeleteMe; var BatchFile: TextFile; BatchFileName: string; ProcessInfo: TProcessInformation; StartUpInfo: TStartupInfo; begin { создаём бат-файл в директории приложения } BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';
{ открываем и записываем в файл } AssignFile(BatchFile, BatchFileName); Rewrite(BatchFile);
Writeln(BatchFile, ':try'); Writeln(BatchFile, 'del "' + ParamStr(0) + '"'); Writeln(BatchFile, 'if exist "' + ParamStr(0) + '"' + ' goto try'); Writeln(BatchFile, 'del "' + BatchFileName + '"'); CloseFile(BatchFile);
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00); StartUpInfo.dwFlags := STARTF_USESHOWWINDOW; StartUpInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(BatchFileName), nil, nil, False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo) then begin CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); end;
end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Задача синхронизации встает при одновременном доступе нескольких процессов (или нескольких потоков одного процесса) к какому-либо ресурсу. Поскольку поток в Win32 может быть остановлен в любой, заранее ему неизвестный момент времени возможна ситуация, когда один из потоков не успел завершить модификацию ресурса (например, отображенной на файл области памяти), но был остановлен, а другой поток попытался обратиться к этому же ресурсу. В этот момент ресурс находится в несогласованном состоянии, и последствия обращения к нему могут быть самыми неожиданными – от порчи данных, до нарушения защиты памяти.
Главной идеей, положенной в основу синхронизации потоков в Win32 является использование объектов синхронизации и функций ожидания. Объекты могут находиться в одном из двух состояний – Signaled или Not Signaled. Функции ожидания блокируют выполнение потока до тех пор, пока заданный объект находится в состоянии Not Signaled. Таким образом, поток, которому необходим эксклюзивный доступ к ресурсу, должен выставить какой-либо объект синхронизации в несигнальное состояние, а по окончании – сбросить его в сигнальное. Остальные потоки должны перед доступом к этому ресурсу вызвать функцию ожидания, которая позволит им дождаться освобождения ресурса.
Рассмотрим, какие объекты и функции синхронизации предоставляет нам Win32 API.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки