![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тормоза и таймер [D7, XP]
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
у него заголовки окон, а не список экзешников