Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тормоза и таймер [D7, XP]


Страницы:   1 2 3 4

Alex_Ford ©   (2008-11-07 10:05:00) 

Привет!

Мастера у меня программа выполняет несколько задач. Все задачи выполняет таймер. Но от этого комп сильно тормозит. Используется всего один компонент таймер с интервалом в одну секунду. Что нужно сделать чтобы все работало без тормозов.

С уважением!


Leonid Troyanovsky   (2008-11-08 13:49:00) [21]


> Alex_Ford   (08.11.08 13:33) [51]

> Вы уж меня простите за такие слова, но я вот уже второй
> день как бьюсь над этой задачей. И никто не хочет указать,
>  куда нужно смотреть, на что нужно обращать особое внимание
> для решения поставленной задачи!

Не плачь, начни новый проект, положи на него checklistbox и
один button, по нажатию которого будет производится:

var
 i: Longint;
 h: THandle;
..
CreateToolhelp32Snapshot();
Process32First();
repeat
 for i := 0 to CheckListBox1.Count-1 do
    if checkListBox1.Checked[i] then
    {сравниваем имя файла с запрещенными}
    {и если найдено, то}
    begin
      h:= OpenProcess(PROCESS_TERMINATE, false, FP.th32ProcessID);
      Win32Check(h <> 0);
      Win32Check(TerminateProcess(h, 0));
      CloseHandle(h);
    end;

until Process32Next();
..

--
Regards, LVT.


Alex_Ford   (2008-11-08 13:33:00) [22]

Ребят, на этом форуме часто стали прикалываться над начинающими.
Год назад я был в восторге от того, что delphimaster имеет такой высокий показатель не только по посещаемости, но и по количеству оказанной помощи! Теперь это превращается не в так сказать, образовательный портал, а скорее всего ареной, где так сказать профи, называющие себя мастерами только улыбаются в ответ!!!!
Вы уж меня простите за такие слова, но я вот уже второй день как бьюсь над этой задачей. И никто не хочет указать, куда нужно смотреть, на что нужно обращать особое внимание для решения поставленной задачи!
Ответы только одни - читай да вникай. Вспомните сами, мастера, что в школе вам родители помошали решать задачки и помогали вникать!

Delphimaster.ru - для меня тоже как родители. Причем родные! А подсказать или помочь никто не хочет.
Очень жаль......

p.s. до слёз.


Johnmen   (2008-11-08 13:29:00) [23]


> Riply ©   (08.11.08 13:21) [48]
> А это ничего, что

Это отлично!


Leonid Troyanovsky   (2008-11-08 13:26:00) [24]


> Alex_Ford   (08.11.08 13:17) [46]

> Например,
> crack.exe
> proga.exe
> winamp.exe
> и так далее...
>
> Они отмечены checklistbox1.Checked:= true;

Ну и славно, время от времени проходись Process32First - Next
и сравнивай с запрещенными (и отмеченными в списке),
если нашлось - OpenProcess/TerminateProcess/CloseHandle.

> Вот именно эти отмеченные и нужно завершать функцией KillTask.

KillTask - в печь.

--
Regards, LVT.


Riply   (2008-11-08 13:21:00) [25]

> [42] Alex_Ford   (08.11.08 12:10)
> Добрый день, мастера!

А это ничего, что
exe:= checklistbox1.Items.Strings[i];
KillTask( st);

? :)


Loginov Dmitry   (2008-11-08 13:19:00) [26]

> Например,
> crack.exe
> proga.exe
> winamp.exe
> и так далее...


А где же в примере "папки"?


Alex_Ford   (2008-11-08 13:17:00) [27]

В checklistbox у меня хранится список, что убивать.

Например,
crack.exe
proga.exe
winamp.exe
и так далее...

Они отмечены checklistbox1.Checked:= true;
Вот именно эти отмеченные и нужно завершать функцией KillTask.


Leonid Troyanovsky   (2008-11-08 13:11:00) [28]


> Alex_Ford   (08.11.08 13:00) [44]

> Если папка то послать сообщение
> postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);

А если мамка?
Огласи весь checklistbox.

--
Regards, LVT.


Alex_Ford   (2008-11-08 13:00:00) [29]

st - это имя папки, которое хранится в checklistbox (например: Новая папка)
exe - это имя процесса, например crack.exe (из диспетчера задач)

Если папка то послать сообщение
postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);

Если прога (как процесс) то убить ее как процесс, т.е. так
KillTask(st);


Loginov Dmitry   (2008-11-08 12:44:00) [30]

> Мастера, подскажите пожалуйста, где кроется ошибка?


procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
 st: string;
 exe: string;
begin
  for i:=0 to checklistbox1.Items.Count-1 do
  begin
    if checkListBox1.Checked[i] = true then
    begin
    st:= checklistbox1.Items.Strings[i];
    postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);
    end else
    exe:= checklistbox1.Items.Strings[i];
    KillTask(st);
end;
    application.ProcessMessages;
end;


Это че вообще за безобразие? Что оно делать хоть должно?


Alex_Ford   (2008-11-08 12:10:00) [31]

Удалено модератором
Примечание: дубль


Alex_Ford   (2008-11-08 12:10:00) [32]

Добрый день, мастера!

Продолжаю работать над поставленной задачей. Но пока решить ее нормально не получается.

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

Дано:
Функция, которая убивает процессы, как .*ехе.


function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
Co:BOOL;
FS:THandle;
FP:TProcessEntry32;
begin
result:=0;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FP.th32ProcessID),0));
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
end;


Данные для имен папок и имен ехе содержатся в CheckListBox.
Для проверки использую таймер с интервалом в 1 секунду.
В цикле проверяю, если это заголовок (имя папки), то ее закрыть.


procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
  st: string;
  exe: string;
begin
   for i:=0 to checklistbox1.Items.Count-1 do
   begin
     if checkListBox1.Checked[i] = true then
     begin
     st:= checklistbox1.Items.Strings[i];
     postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);
     end else
     exe:= checklistbox1.Items.Strings[i];
     KillTask(st);
end;
     application.ProcessMessages;
end;


В результате чего, программа ужасно сильно нагружает систему.
Мастера, подскажите пожалуйста, где кроется ошибка?


Anatoly Podgoretsky   (2008-11-07 18:44:00) [33]

Так во втором случае нет проверки - а это уже ошибка в этом случае.


clickmaker   (2008-11-07 16:49:00) [34]

> [38] Anatoly Podgoretsky ©   (07.11.08 16:35)
> И в 21 и в 24 все равно два раза

это на случай, если очень шустрый пользователь успеет переоткрыть окно между вызовами


Anatoly Podgoretsky   (2008-11-07 16:35:00) [35]

И в 21 и в 24 все равно два раза

    if findwindow(nil,pchar(st))<>0 then
       postmessage( findwindow(nil,pchar(st),),WM_CLOSE,0,0);


Johnmen   (2008-11-07 13:19:00) [36]

Как можно что-то объяснить человеку, если он ничего, кроме копи-паста, не знает и не умеет?


Vlad Oshin   (2008-11-07 13:11:00) [37]

checklistbox1.Items.Strings[i]; это окна

GetWindowThreadProcessId  - процесс по окну

потом его kill


clickmaker   (2008-11-07 13:02:00) [38]

> for i:=0 to form1.CheckListBox1.Items.Count-1  do
> if checklistbox1.Items.Count = 0 then exit

сам-то понял, что написал?


Alex_Ford   (2008-11-07 12:54:00) [39]

Товарищи!

Посмотрите, что так и что не так:

Сама функция убивающая ехе


function KillTask(ExeFileName: string): integer;
const
 PROCESS_TERMINATE=$0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 result := 0;

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

 while integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
   UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
   UpperCase(ExeFileName))) then
     Result := Integer(TerminateProcess(OpenProcess(
     PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;




Обрабатываю в таймере с интервалом 3 секунды так.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 for i:=0 to form1.CheckListBox1.Items.Count-1  do
 if checklistbox1.Items.Count = 0 then exit else
     if checkListBox1.Checked[i] = true then
     begin
     st:= checklistbox1.Items.Strings[i];
     KillTask(st);     //уничтожим процессы из списка
end;


Правильный$Вася   (2008-11-07 12:48:00) [40]


> Вызывай эту функцию с параметром st

у него заголовки окон, а не список экзешников


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо