завис ? не завис ? ...

  • Автор темы Spoiler
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Spoiler

Всем привет.

Народ скажите как можно из дельфи зная имя процесса определить завис он или нет.

Люди памагите проблема тормозит всю работу ...
 
B

Barmutik

Для начала расшифруйте Ваше понимания термина завис?
 
S

Spoiler

Для начала расшифруйте Ваше понимания термина завис?

завис, насколько я понимаю это когда процесс не отвечает на системные запросы.

как определить завис процесс или нет скажите кто нибудь
 
B

Barmutik

Не отвечает на системные запросы это не значит что он заивс полностью.. вполне возможно что сейчас процесс вполняет критичные действия и не обрабатывает очередь сообщений.

Для определния можно использовать SendMessageTimeout и например послатьWM_NULL или например если процесс работает то GetExitCodeProcess возвращает STILL_ACTIVE

Или сипользовать WaitForInputIdle..

Менеджер задач как бытует мнение (не 100% верное) использует SendMessageTimeOut c 3-5 секундным интервалом...
 
S

Spoiler

Не отвечает на системные запросы это не значит что он заивс полностью.. вполне возможно что сейчас процесс вполняет критичные действия и не обрабатывает очередь сообщений.

Для определния можно использовать SendMessageTimeout и например послатьWM_NULL или например если процесс работает то GetExitCodeProcess возвращает STILL_ACTIVE

Или сипользовать WaitForInputIdle..

Менеджер задач как бытует мнение (не 100% верное) использует SendMessageTimeOut c 3-5 секундным интервалом...

если неслложно кинь примерчик для opera.exe ( просто не пойму как использовать эти функции )
очнь надо ...

ЗЫ можно для SendMessageTimeout или GetExitCodeProcess
 
B

Barmutik

Посмотрите описание функции .. у Вас есть хэндл процесса и он передаётся во все эти функции...

Что конкретно вызывает проблемы?
 
S

Spoiler

Посмотрите описание функции .. у Вас есть хэндл процесса и он передаётся во все эти функции...

Что конкретно вызывает проблемы?

хэндла нет

есть имя процесса, и большое желание провреить висит он или нет ...

трудности именно по использованию функции, в смы
 
B

Barmutik

Хммм.. Если у Вас есть имя процесса... то переберите все процессы по слепку через функцию CreateToolhelp32Snapshot.

Найдите по имени Ваш процесс.. вот Вам и хэндл.. а далее посмотреть ХЕЛП по использованию функций и вызвать их с нужными параметрами...
 
S

Spoiler

Люди. Я не пойму так сложно кинуть примерчик по данной функции что ли ...
 
B

Barmutik

По какой конкретно?

Или за Вас надо всё полностью написать.. <_<
 
S

Spoiler

<_<

Barmutik
SendMessageTimeOut

Вобщем нарыл функцию которая проверяет помер процесс или нет

function AppIsResponding(ClassName: string): Boolean;
const
{ Specifies the duration, in milliseconds, of the time-out period }
TIMEOUT = 50;
var
Res: DWORD;
h: HWND;
begin
h := FindWindow(PChar(ClassName), nil);
if h <> 0 then
Result := SendMessageTimeOut (H,
WM_NULL,
0,
0,
SMTO_NORMAL or SMTO_ABORTIFHUNG,
TIMEOUT,
Res) <> 0
else
ShowMessage(Format('%s not found!', [ClassName]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if AppIsResponding('OpusApp') then
{ OpusApp is the Class Name of WINWORD }
ShowMessage('App. responding');
end;

Есть функция по перебору всех процессов - читаю в память ( фкнкция определения состояния процесса будет вызываться достаточно часто так что работаю с памятью )

function IST.READ_PC_IN_RAM : string;
var
RD : longint;

ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

RD := 1;
while integer(ContinueLoop) <> 0 do
begin
Pc_IN_RAM[ RD ] := AnsiLowerCase(ExtractFileName(FProcessEntry32.szExeFile));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
INC( RD );
end;

while Pc_IN_RAM[ RD ] <> '' do begin
Pc_IN_RAM[ RD ] := '';
Inc( RD );
end;

CloseHandle(FSnapshotHandle);
end;

Народ как из имени процесса вытянуть хэндл ( ? ), и если несложно как будет выглядеть функция определения проверяющая завис процесс или нет.

Киньте примерчик, очень надо :lol:
 
B

Barmutik

Вообще-то в Вашем примере Вы используете структуру TProcessEntry32 у этой структуру есть поле th32ProcessID, в котором и находится тот идентификатор процесса что Вам и требуется.

Вот даже в MSDN есть фраза насчёт SendMessageTimeout:

This function considers a thread is not responding or is "hung" if it has not called GetMessage or a similar function within five seconds.

В общем случае у процеса может не быть окна и вы его не найдёте с помощью FindWindow. Но если оно есть то пример приведённый Вами выше вполне справится с задачей которую Вы хотите решить...
 
S

Spoiler

В общем это, ногами просьба не бить ...

Исходя из всего вышесказанного предположил следующее, ( эот только предположение ... )

function READ_PC_IN_RAM : string;
var
RD : longint;

ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

RD := 1;
while integer(ContinueLoop) <> 0 do
begin
// Pc_IN_RAM[ RD ] := AnsiLowerCase(ExtractFileName(FProcessEntry32.szExeFile));


if AnsiLowerCase( ExtractFileName( FProcessEntry32.szExeFile ) ) = 'opera.exe' then
Zavison_YN( FProcessEntry32.szExeFile ); //Zavison_YN это AppIsResponding

ContinueLoop := Process32Next( FSnapshotHandle, FProcessEntry32 );
INC( RD );
end;
end;

Люди подскажите, как можно вытянуть идентификатор процесса ...
 
B

Barmutik

Ну по идее должно работать ...

А чем Вам не понравился мой способ доставания идентификатора процесса из Вашей структуры? <_< :lol: Прочтите мой предыдущий пост...
 
S

Spoiler

Вобщем вроде что то написал, у меня вопрос вот какой

сделал в дельфи приложение ( пустая форма плюс кнопка, при нажатии на которую запускается бесконечный цикл ). Проблема вот в чем при запуске этого приложения данный алгоритм никак не реагирует на зависший процесс ниче не возвращает в то время при проверки оперы возвращается ноль

Почему ?

И еще - функция SendMessageTimeOut возвращает 0 если приложение обрабатывает посылаемое сообщение или нет ?



function Zavison_YN (ClassName: cardinal): longint;
var Res : DWORD;
h : HWND;
begin
h := FindWindow(PChar( ClassName ), nil);

SendMessageTimeOut (H,
WM_NULL,
0,
0,
SMTO_ABORTIFHUNG,
0,
Res);

Zavison_YN := Res;
end;

function READ_PC_IN_RAM : string;
var
RD : longint;

ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

RD := 1;
while integer(ContinueLoop) <> 0 do
begin
// Pc_IN_RAM[ RD ] := AnsiLowerCase(ExtractFileName(FProcessEntry32.szExeFile));
if AnsiLowerCase( ExtractFileName( FProcessEntry32.szExeFile ) ) = 'delphi32.exe' then begin
ShowMessage( inttostr( Zavison_YN( FProcessEntry32.th32ProcessID ) ) );
end;

ContinueLoop := Process32Next( FSnapshotHandle, FProcessEntry32 );
INC( RD );
end;
end;
 
B

Barmutik

Ну потому что Ваш процесс выедает всё процессорное время. Вот никому больше оно и не достаётся.

Иммет смысл вставить
Код:
 Sleep(1);
Application.Processmessages;

для того что бы отдавать часть времени другим.

Вот что говорит MSDN насчёт кода возврата:

If the function succeeds, the return value is nonzero.
 
S

Spoiler

Вставил процессмессэдже то же самое програ не видит этот процесс

По второму возник вопрос
If the function succeeds, the return value is nonzero

Если функция успешна то возврат не ноль это как

Функция выполнилась успешно - процее к которому обращаются висит или нет ?
 
S

Spoiler

Извиняюсь за последний пост ( глюка там = нижний регистр текущий процесс сравниваю с S1 )

переделал, но какая то ерунда там, висит не висит мое S1.exe алгоритм все равно возвращает ноль, что все так не так


ЛЮДИ ПАМАГИТЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕ !!!!!!!!!!!!!
 
S

Spoiler

Ну по идее должно работать ...

А чем Вам не понравился мой способ доставания идентификатора процесса из Вашей структуры? Прочтите мой предыдущий пост...

Вообще-то в Вашем примере Вы используете структуру TProcessEntry32 у этой структуру есть поле th32ProcessID, в котором и находится тот идентификатор процесса что Вам и требуется.

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

Разьясните, что я так сделал.
Использовал FProcessEntry32.th32ProcessID - вытянул идентификатор процесса и передал на вход функции Zavison_YN (ClassName: cardinal): longint;

У меня всетаки вопрос еще по параметрам функции, в функции используются правильные параметры или нет ...

function Zavison_YN (ClassName: cardinal): longint;
var Res : DWORD;
h : HWND;
begin
h := FindWindow(PChar( ClassName ), nil);

SendMessageTimeOut (
H,
WM_WININICHANGE ,
0,
0, //SMTO_ABORTIFHUNG,
SMTO_NORMAL,
50,
Res);

Zavison_YN := Res;
end;
 
S

Spoiler

Народ, кто что посоветует по проблеме ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!