Процессы, потоки, память, задачи
Первый способ:
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; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Ниже приведены два примера, которые при создании потоков позволяют обойтись без класса TThread, используя API функции CreateThread, SuspendThread, ResumeThread и TerminateThread.
Пример 1:
Поместите на форму 2 окошка редактирования (edit) и 6 кнопок. Далее приведён сам код:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Есть handle запущенного PE файла. Как определить откуда он был запущен?
Я так предполагаю что getmodulefilename как и GetModuleHandle
работает в рамках только своего процесса.
А решить твою задачу .. можно так:
Тут парочка моих любимых функций
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Автор: Gert v.d. Venis
Описание:
Данный компонент получает хэндл(handle) любого запущенного окна и даёт возможность отправить по указанному хэндлу любые комбинации нажатия клавиш.
Совместимость: Все версии Delphi
Компонент Sendkeys:
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Следующий пример изменяет приоритет приложения. Изменение приоритета следует использовать с осторожностью - т.к. присвоение слишком высокого приоритета может привети к медленной работе остальных программ и системы в целом. См. Win32 help for SetThreadPriority() function.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Задача синхронизации встает при одновременном доступе нескольких процессов (или нескольких потоков одного процесса) к какому-либо ресурсу. Поскольку поток в Win32 может быть остановлен в любой, заранее ему неизвестный момент времени возможна ситуация, когда один из потоков не успел завершить модификацию ресурса (например, отображенной на файл области памяти), но был остановлен, а другой поток попытался обратиться к этому же ресурсу. В этот момент ресурс находится в несогласованном состоянии, и последствия обращения к нему могут быть самыми неожиданными – от порчи данных, до нарушения защиты памяти.
Главной идеей, положенной в основу синхронизации потоков в Win32 является использование объектов синхронизации и функций ожидания. Объекты могут находиться в одном из двух состояний – Signaled или Not Signaled. Функции ожидания блокируют выполнение потока до тех пор, пока заданный объект находится в состоянии Not Signaled. Таким образом, поток, которому необходим эксклюзивный доступ к ресурсу, должен выставить какой-либо объект синхронизации в несигнальное состояние, а по окончании – сбросить его в сигнальное. Остальные потоки должны перед доступом к этому ресурсу вызвать функцию ожидания, которая позволит им дождаться освобождения ресурса.
Рассмотрим, какие объекты и функции синхронизации предоставляет нам Win32 API.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Разные вопросы, процессы потоки
Читать из реестра HKEY_DYN_DATA\PerfStats\StatData соответствующий ключ Kernel \CPUUsage.
или
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Если внутренняя переменная hPrevInst не равна нулю, то она содержит дескриптор предыдущего запущенного экземпляра вашей программы. Вы просто находите открытое окно по его дескриптору и, при необходимости, выводите на передний план. Весь код расположен в файле .DPR file, НЕ в модуле. Строки, которые вам необходимо добавить к вашему .DPR-файлу, в приведенном ниже примере помечены {*}.
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Code: |
function IsRunning( sName : string ) : boolean; var han : THandle; ProcStruct : PROCESSENTRY32; // from "tlhelp32" in uses clause sID : string; begin Result := false; // Get a snapshot of the system han := CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 ); if han = 0 then exit; // Loop thru the processes until we find it or hit the end ProcStruct.dwSize := sizeof( PROCESSENTRY32 ); if Process32First( han, ProcStruct ) then begin repeat sID := ExtractFileName( ProcStruct.szExeFile ); // Check only against the portion of the name supplied, ignoring case if uppercase( copy( sId, 1, length( sName ) ) ) = uppercase( sName ) then begin // Report we found it Result := true; Break; end; until not Process32Next( han, ProcStruct ); end; // clean-up CloseHandle( han ); end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Code: |
procedure TForm1.Button1Click(Sender: TObject); VAR Wnd : hWnd; buff: ARRAY [0..127] OF Char; begin ListBox1.Clear; Wnd := GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DO BEGIN {Не показываем:} IF (Wnd <> Application.Handle) AND {-Собственное окно} IsWindowVisible(Wnd) AND {-Невидимые окна} (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна} (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков} THEN BEGIN GetWindowText(Wnd, buff, sizeof(buff)); ListBox1.Items.Add(StrPas(buff)); END; Wnd := GetWindow(Wnd, gw_hWndNext); END; ListBox1.ItemIndex := 0; end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Code: |
procedure TForm1.Button1Click(Sender: TObject); var ProcessID: DWORD; ProcessHandle: THandle; ThreadHandle: THandle; begin ProcessID := GetCurrentProcessID; ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, false, ProcessID); SetPriorityClass(ProcessHandle, REALTIME_PRIORITY_CLASS); ThreadHandle := GetCurrentThread; SetThreadPriority(ThreadHandle, THREAD_PRIORITY_TIME_CRITICAL); end; |
- Подробности
- Родительская категория: Процессы, потоки, память, задачи
- Категория: Список задач, процессы и приорететы
Страница 2 из 4