![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
возникла проблема, мне необходимо что бы timer1 выполнялся каждые 10 секунд interval=10000 и в on timer было следующее
Код:
ShellExecute(Handle, nil, 'cmd.exe', '/c '+ 'net session >c:\1.txt', nil, SW_HIDE);
sleep(1000);
ls:=TStringList.Create;
ls.LoadFromFile('c:\1.txt');
d:=DosToWin(ls.Text);
ls.Clear;
ls.Add(d);
ls.SaveToFile('c:\1.txt');
ls.Free; |
|
#2
|
||||
|
||||
|
ls можно создать вне таймера для оптимизации, при запуске программы например onCreate, уничтожать по завершению, например на onClose или как там его. Но сама беда с памятью непонятна. Вроде как все чистенько. Возможно утечка где-то еще, например в DosToWin.
|
|
#3
|
||||
|
||||
|
Знаю, что такая проблема на делфи 7 есть. Вроде как и пишешь, что "что-то".free, а память не освобождается. А когда снова создаёшь, то память отнимается тоже вновь. Так и растёт.
|
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
а если не секрет - почему после загрузки делается dostowin, а перед записью wintodos не делается?
ведь по сути, после второго открытия файла dostowin в исходном коде вроде бы не нужен. либо излишнее в коде, либо недостаточно в плане перекодировки |
|
#6
|
||||
|
||||
|
Цитата:
Код:
type
TFoo = class
public
procedure Free; reintroduce;
end;
procedure TFoo.Free;
begin
GetMem($100500);
end;![]() P.S. Подсветчик синтаксисане не подсветил ключевое слово "reintroduce", как-то не красиво. |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
~TB~ (12.07.2012)
| ||
|
#7
|
||||
|
||||
|
ну так опять-таки косяк разработчика, а не Delphi. подсветка это всего лишь сладкая французкая булочка к чаю)
|
|
#8
|
||||
|
||||
|
Закинь сюда урезанный рабочий код - посмотрю, попытаюсь оптимизировать.
|
|
#9
|
|||
|
|||
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellApi, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ls:TStringList;
d:string;
implementation
{$R *.dfm}
function DosToWin(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
OemToAnsi(PChar(St), Ch);
Result := Ch;
StrDispose(Ch)
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ShellExecute(Handle, nil, 'cmd.exe', '/c '+ 'net session >c:\1.txt', nil, SW_HIDE);
sleep(1000);
ls:=TStringList.Create;
ls.LoadFromFile('c:\1.txt');
d:=DosToWin(ls.Text);
ls.Clear;
ls.Add(d);
ls.SaveToFile('c:\1.txt');
ls.Free;
end;
end. |
|
#10
|
||||
|
||||
|
используй CreateProcess вместо ShellExecute:
Код:
var
startupinfo: TStartupInfo;
processinformation: TProcessInformation;
ls: TStringList;
begin
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
startupinfo.cb:=SizeOf(TStartupInfo);
startupinfo.dwFlags:=STARTF_USESHOWWINDOW;
startupinfo.wShowWindow:=SW_HIDE;
CreateProcess(nil, 'cmd.exe /c net session >c:\1.txt', nil, nil, False, 0, nil, nil, startupinfo, processinformation);
WaitForSingleObject(processinformation.hProcess, INFINITE);
CloseHandle(processinformation.hThread);
CloseHandle(processinformation.hProcess);
ls:=TStringList.Create;
try
ls.LoadFromFile('c:\1.txt');
ls.Text:=DosToWin(ls.Text);
ls.SaveToFile('c:\1.txt');
finally
ls.Free;
end;
end; |
|
#11
|
||||
|
||||
|
Цитата:
Вот держи. |
|
#12
|
||||
|
||||
|
Желательно так делать
Код:
function DosToWin(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
try
OemToAnsi(PChar(St), Ch);
Result := Ch;
finally
StrDispose(Ch)
end;
end;З.Ы. вот это скорость, пока писал 2 поста влепили ![]() |
|
#13
|
||||
|
||||
|
Цитата:
|
|
#14
|
|||
|
|||
|
Цитата:
|
|
#15
|
||||
|
||||
|
Цитата:
Проверил на Win7 x64 (компилятор от XE) - безконтрольного увеличения памяти не увидел. Однако так писать нельзя, ИМХО. Зачем создавать форму если она у тебя в Auto-create? Что по сути происходит в данном проекте: - есть переменная form2, она "связана" с автоматически созданной формой (форма создана при старте проекта). - по нажатию кнопки ты создаешь новую форму и "связываешь" ее с переменной form2 (под это выделяется память, видим прирост памяти в диспетчере задач), получается что на экземпляр второй формы который был создан при старте приложения уже не указывает никакая переменная - это называется утечка памяти, но в данном случае проблема не в delphi, а в криворукости программиста. - затем ты делаешь free для второй формы, переменная form2 уже никуда не указывает, память помечается как свободная (но не отдается обратно системе, это не бага это фича), и при повторном нажатии на кнопку форма заново создается, память выделяется (т.к. есть свободная то у системы больше не просим, и в дипетчере задач изменения объема памяти не наблюдается). Вот так-то. |