Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.058 c
15-1223942626
Германн
2008-10-14 04:03
2008.12.21
Из Паскаля в Си


2-1226656814
Serega87
2008-11-14 13:00
2008.12.21
Количество веток в ветке


9-1176119436
ElectriC
2007-04-09 15:50
2008.12.21
CD3DFont текст


1-1204293724
Kolan
2008-02-29 17:02
2008.12.21
Реализация интерфейса-мастера.


15-1224154232
Darvin
2008-10-16 14:50
2008.12.21
COM и иерархия ООП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский