![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тормоза и таймер [D7, XP]
Alex_Ford © (2008-11-07 10:05:00)Привет!
Мастера у меня программа выполняет несколько задач. Все задачи выполняет таймер. Но от этого комп сильно тормозит. Используется всего один компонент таймер с интервалом в одну секунду. Что нужно сделать чтобы все работало без тормозов.
С уважением!
Сергей М. (2008-11-07 12:42:00) [41]
> Alex_Ford (07.11.08 12:21) [31]
Вызывай эту функцию с параметром st
Alex_Ford (2008-11-07 12:21:00) [42]мастера подскажите тогда пожалуйста, как правильно воспользоваться этой функцией с использованием таймера и checklistbox1 ?
Или с ума сойду - так и не поняв как это работает что и как нужно сделать правильно.
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;
Сергей М. (2008-11-07 12:17:00) [43]
> Правильный$Вася (07.11.08 12:01) [29]
Производительность капиталистического труда обратно пропорциональна значению интервала срабатывания таймера
Правильный$Вася (2008-11-07 12:01:00) [44]
> for i:=0 to form1.CheckListBox1.Items.Count-1 do
> if checklistbox1.Items.Count = 0 then exit
просто песня!
а зачем каждую секунду? что, нельзя разве игру закрыть через 10 сек?
Сергей М. (2008-11-07 12:00:00) [45]
> Что бы нагреть процессор.
>
А прогу, соответственно, переименовать в Утюг.ехе
Anatoly Podgoretsky (2008-11-07 11:58:00) [46]> Сергей М. (07.11.2008 11:40:23) [23]
Что бы нагреть процессор.
Anatoly Podgoretsky (2008-11-07 11:57:00) [47]> Alex_Ford (07.11.2008 11:33:21) [21]
Процессор нагревается когда он выполняет операции.
Alex_Ford (2008-11-07 11:49:00) [48]Удалено модератором
Alex_Ford (2008-11-07 11:49:00) [49]В посте 21 FindWindow я вызывал один раз.
Вот переделанный код. Кажется работает.
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];
if findwindow(nil,pchar(st))<>0 then
postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);
end;
end;
Сергей М. (2008-11-07 11:40:00) [50]
> Alex_Ford (07.11.08 11:33) [21]
За каким лешим ты дваждывызываешь FindWindow ?
Один раз вызвал, нашел окно, получил его хэндл и передал параметром в PostMessage !
Anatoly Podgoretsky (2008-11-07 11:34:00) [51]> Alex_Ford (07.11.2008 11:12:17) [17]
Приказ, вокзал, дорога
Как видишь программист здесь не фигурирует.
Alex_Ford (2008-11-07 11:33:00) [52]Хорошо, буду копать, тогда скажите мне пожалуйста, почему когда список загружен из файла и ежесекундно проверяется запущена ли папка или нет, проц нагревается аж до 70% ???
var
Form1: TForm1;
i: integer;
st: string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=0 to 1000 do
begin
checklistbox1.Items.Add('items '+inttostr(i));
checklistbox1.Checked[i]:= true;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
checklistbox1.Items.SaveToFile('C:\test.txt');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
checklistbox1.Items.LoadFromFile('C:\test.txt');
for i:=0 to form1.CheckListBox1.Items.Count-1 do
checklistbox1.Checked[i]:= true;
end;
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
st:= checklistbox1.Items.Strings[i];
if findwindow(nil,pchar(st))<>0 then
postmessage(findwindow(nil,pchar(st),),WM_CLOSE,0,0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Button3Click(self);
end;
end.
Anatoly Podgoretsky (2008-11-07 11:24:00) [53]
> Значит, возможно проблема в том, что я не правильно расставляю
> скобки begin..end
Начни с того, что правильно расставь скобки, с учетом иерархиии - никто же за тебя здесь это делать не будет и пробираться через произвольную лесенку скобок тоже.
Правильный$Вася (2008-11-07 11:17:00) [54]
> Если checked = true то папка закрывается, если галочка
> снята, то ее открыть можно
т.е. ты перечислил все папки вместотого, чтобы перечислить только нужные для закрытия?
Сергей М. (2008-11-07 11:16:00) [55]
> и так сойдет. На мой взгляд
Тебя случаем не Владимиром зовут ?)
> Проблема в одном - игры, а не работа
Все равно как играли так и играть будут. Лазейки всегда найдутся.
Проблема решается толькоадминистративным путем.
Alex_Ford (2008-11-07 11:12:00) [56]Кто, куда и как ее "запустил" ?
И чем она помешала будучи в "запущенном" состоянии, коль скоро нужно за этим безобразием постоянно следить ?
Проблема в одном - игры, а не работа !!!!!!!!!
Alex_Ford (2008-11-07 11:11:00) [57]Для того кто плохо шарит в компе и так сойдет. На мой взгляд.
Короче задача такая. Не давать открывать папки и запускать exe, которые в списке и выбраны в checklistbщx.
В нете нашел код котороый убивает процессы
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;
Это помещается в список и обрабатывается каждую секунду.
Сергей М. (2008-11-07 11:09:00) [58]
> запущена ли папка
Кто, куда и как ее "запустил" ?
И чем она помешала будучи в "запущенном" состоянии, коль скоро нужно за этим безобразием постоянно следить ?
clickmaker (2008-11-07 11:05:00) [59]гы... это такой хитрый способ запретить юзеру открывать папку?
Alex_Ford (2008-11-07 11:04:00) [60]//Излагай подробно задачу, которую должно решать твое приложение ..
Извиняюсь!
Программа должна проверять, запущена ли папка, которая содержится в списке. Список - компонент checkListBox1. Если checked = true то папка закрывается, если галочка снята, то ее открыть можно