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

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

Spoiler

#1
Всем привет.

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

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

Barmutik

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

Spoiler

#3
Для начала расшифруйте Ваше понимания термина завис?
завис, насколько я понимаю это когда процесс не отвечает на системные запросы.

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

Barmutik

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

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

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

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

Spoiler

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

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

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

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

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

Barmutik

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

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

Spoiler

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

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

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

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

Barmutik

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

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

Spoiler

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

Barmutik

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

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

Spoiler

#11
<_<

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

#12
Вообще-то в Вашем примере Вы используете структуру 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

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

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

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

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

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

Spoiler

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

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

Почему ?

И еще - функция 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

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

Иммет смысл вставить
Код:
 Sleep(1);
Application.Processmessages;
для того что бы отдавать часть времени другим.

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

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

Spoiler

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

По второму возник вопрос
If the function succeeds, the return value is nonzero
Если функция успешна то возврат не ноль это как

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

Spoiler

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

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


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

Spoiler

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

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

Вообще-то в Вашем примере Вы используете структуру 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;
 
Статус
Закрыто для дальнейших ответов.