Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Тормоза и таймер   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2008-11-07 18:44) [40]

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


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

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

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

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

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


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;


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


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

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


 
Loginov Dmitry ©   (2008-11-08 12:44) [43]

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


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 13:00) [44]

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

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

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


 
Leonid Troyanovsky ©   (2008-11-08 13:11) [45]


> 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:17) [46]

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

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

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


 
Loginov Dmitry ©   (2008-11-08 13:19) [47]

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


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


 
Riply ©   (2008-11-08 13:21) [48]

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

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

? :)


 
Leonid Troyanovsky ©   (2008-11-08 13:26) [49]


> 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.


 
Johnmen ©   (2008-11-08 13:29) [50]


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

Это отлично!


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

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

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

p.s. до слёз.


 
Leonid Troyanovsky ©   (2008-11-08 13:49) [52]


> 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 14:05) [53]

Леонид! Спасибо за помощь!

Я немного плохо соображаю здесь. Затрудняюсь что писать в скобках.
CreateToolhelp32Snapshot()  - TH32CS_SNAPPROCESS, 0;
Process32First(); ??? :(

Подскажите пожалуйста, куда смотреть?


 
Leonid Troyanovsky ©   (2008-11-08 14:21) [54]


> Alex_Ford   (08.11.08 14:05) [53]

> Я немного плохо соображаю здесь. Затрудняюсь что писать
> в скобках.


uses
 tlhelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
 h:Thandle;
 i: Longint;
 Co:BOOL;
 FS:THandle;
 FP:TProcessEntry32;
begin
 FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 FP.dwSize:=Sizeof(FP);
 Co:=Process32First(FS,FP);
 repeat
   for i := 0 to CheckListBox1.Count-1 do
     if checkListBox1.Checked[i] then
        if ((UpperCase(ExtractFileName(FP.szExeFile))=
            UpperCase(CheckListBox1.Items[i]))) then
         {сравниваем имя файла с запрещенными}
         {и если найдено, то}
         begin
           h:= OpenProcess(PROCESS_TERMINATE, false, FP.th32ProcessID);
           Win32Check(h <> 0);
           Win32Check(TerminateProcess(h, 0));
           CloseHandle(h);
         end;
  until (not Process32Next(FS,FP));
  CloseHandle(FS);
end;


Но, это еще не все. Перед тем как вешать подобный код
на таймер нужна тщательная работа над ошибками.
Как, например, CloseHandle(FS); д.б. в секции finally.

--
Regards, LVT.


 
engine ©   (2008-11-08 14:29) [55]

uses ..., TlHelp32;
....
var
 h : THandle;
 tPE32 : tagPROCESSENTRY32;
begin
 tPE32.dwSize :=  SizeOf(tPE32);
 h := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
 if Process32First(h, tPE32) ...
 ...
end;


 
Leonid Troyanovsky ©   (2008-11-08 14:37) [56]


> Alex_Ford   (08.11.08 14:05) [53]

> Подскажите пожалуйста, куда смотреть?

Смотреть надо http://msdn.microsoft.com/.
Т.е., обязательно анализировать возвращаемый результат
и если требуется, то и GetLastError.
Например:

    h := OpenProcess(PROCESS_TERMINATE, false, FP.th32ProcessID);
    try
       Win32Check(h <> 0);
       Win32Check(TerminateProcess(h, 0));
    finally
       if h <> 0 then
         CloseHandle(h);
    end;

--
Regards, LVT.


 
Alex_Ford   (2008-11-08 14:38) [57]

Большое спасибо!

Не понятно только одно, почему, когда в списке отмечено 2-3 элемента на обработку, программа работает ХОРОШО!
Но. когда список достигает около 200-300 элементов с активным свойством checked, то программа ужасно сильно тормозит.


 
Loginov Dmitry ©   (2008-11-08 15:03) [58]

> А подсказать или помочь никто не хочет.


В данном случае это не мудрено. Тому есть причины. В основном - это уровень автора. По тому коду, что здесь выкладывается создается впечатление, что уровень автора очень-очень низкий. Человек самостоятельно не может расставить операторные скобки BEGIN..END. Ясно, что никакие объянения и подсказки не помогут. Единственный способ помочь - выложить готовый год, причем комментировать его - бесполезно. Форумчане же стремятся помогать именно подсказками и намеками, с надежной, что человек вникнет и поймет. А "помогать" автору путем написания готового кода безо всякой надежды на то, что он вникнет - нет абсолютно никакого желания. Это пустая трата времени.


 
Alex_Ford   (2008-11-08 15:21) [59]

Я согласен с Вами. Не спорю. Нет - у меня не "низкий-низкий" уровень. Но я начинающий. Где-то получается быстро и легко, где-то трудно или вообще невозможно нетолько вникнуть, но и понимать. Например, эта ветка форума, для меня одна из самых сложных тем. Но разобраться, попытаться хоть что-то понять - очень сильно хочется. Если бы мне было все равно, или лень - я бы не стал тратить время впустую.

Согласитесь:  Не всем программирование дается одинаково. Каждый копается и открывает для себя новое,  интересное и полезное ПО СВОЕМУ.

Модераторов прошу меня не наказывать, если я что-то не так сказал.
Мотив на свое "несоображение" я принимаю.


 
Anatoly Podgoretsky ©   (2008-11-08 16:18) [60]

> Loginov Dmitry  (08.11.2008 12:44:43)  [43]

А что делает exe и неужели компилятор тебе ничего не сказал, или ты отключил все сообщения, что бы он не надоедал?


 
Anatoly Podgoretsky ©   (2008-11-08 16:22) [61]


> Ребят, на этом форуме часто стали прикалываться над начинающими.

Ты к ним не относишься...


 
Loginov Dmitry ©   (2008-11-08 16:41) [62]

> А что делает exe и неужели компилятор тебе ничего не сказал,
> или ты отключил все сообщения, что бы он не надоедал?


Анатолий, меня-то за что так?)


 
Сергей М. ©   (2008-11-08 17:12) [63]


> Alex_Ford


А кто будет кликать на крыжиках в чеклистбоксе ?

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

Он что, настолько тупорылый, что своими же руками (с пом. любезно предоставленной тобой приблуды с чеклистбоксами и батоном) убивать милые его сердцу цацки и закрывать разные непотребные папки ?)


 
Riply ©   (2008-11-08 17:26) [64]

> [63] Сергей М. ©   (08.11.08 17:12)
> А кто будет кликать на крыжиках в чеклистбоксе ?

Это уже следующая задача.
Пусть человек "покопается" в коде, который ему дали,
разберет его по косточкам (или по битикам :)).
Может и будет результат.
Во всяком случае, он упорен. Так что шанс есть :)


 
Anatoly Podgoretsky ©   (2008-11-08 18:40) [65]

> Loginov Dmitry  (08.11.2008 16:41:02)  [62]

Ты под разбор случайно попался.


 
Johnmen ©   (2008-11-08 20:01) [66]


> Riply ©   (08.11.08 17:26) [64]
> Может и будет результат.

Эт вряд ли (c)

> Во всяком случае, он упорен.

В выпрашивании сырцов?

> Так что шанс есть :)

Наивная...


 
Leonid Troyanovsky ©   (2008-11-09 00:29) [67]


> Alex_Ford   (08.11.08 14:38) [57]

> Но. когда список достигает около 200-300 элементов с активным
> свойством checked, то программа ужасно сильно тормозит.

Для поиска лучше использовать не checklistbox,
а, например, TStringList (Sorted = true) and Find.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-11-09 00:38) [68]


> Riply ©   (08.11.08 17:26) [64]

> Может и будет результат.

Шанс исправиться есть.
Т.е., учесть все замечания, уточнить постановку задачи,
проработать код и показать его здесь.
Тогда и увидим.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-11-09 00:58) [69]


> Сергей М. ©   (08.11.08 17:12) [63]

> и батоном) убивать милые его сердцу цацки и закрывать разные
> непотребные папки ?)

Дык, это ж будет "скыртый" процесс :)

А с папками во-ще непонятно.
Видимо, имелось ввиду закрытие найденных по их заголовкам
окон проводника. Но это весьма наивный путь.

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

--
Regards, LVT.


 
Johnmen ©   (2008-11-09 01:08) [70]


> Leonid Troyanovsky ©   (09.11.08 00:58) [69]
> Дык, это ж будет "скыртый" процесс :)

"скыртый роцесс", не надо переосмысливания...:)))


 
Leonid Troyanovsky ©   (2008-11-09 01:26) [71]


> Johnmen ©   (09.11.08 01:08) [70]

> "скыртый роцесс", не надо переосмысливания...:)))

Вторую часть запамятовал, виноват.

--
Regards, LVT.


 
Германн ©   (2008-11-09 01:33) [72]


> Leonid Troyanovsky ©   (09.11.08 01:26) [71]

Эк тебя понесло! Четыре сообщения в одной ветке за менее чем час!
:)



Страницы: 1 2 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.023 c
15-1224641568
Slider007
2008-10-22 06:12
2008.12.21
С днем рождения ! 22 октября 2008 среда


15-1224152807
stas
2008-10-16 14:26
2008.12.21
Вопрос по ASP.NET


2-1226645549
Sergey
2008-11-14 09:52
2008.12.21
Помогите пожалуйста с сервисом!


15-1224537298
Германн
2008-10-21 01:14
2008.12.21
Поддержим отечественных производителей - 3


2-1226610677
cruiser
2008-11-14 00:11
2008.12.21
Текстовый файл и определение номера или конца строки