![]() |
|
|
Регистрация | << Правила форума >> | 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.
00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110 |
#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", как-то не красиво. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо 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 поста влепили ![]() — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#13
|
||||
|
||||
![]() Цитата:
Пишу программы за еду. __________________ |
#14
|
|||
|
|||
![]() Цитата:
|
#15
|
||||
|
||||
![]() Цитата:
Проверил на Win7 x64 (компилятор от XE) - безконтрольного увеличения памяти не увидел. Однако так писать нельзя, ИМХО. Зачем создавать форму если она у тебя в Auto-create? Что по сути происходит в данном проекте: - есть переменная form2, она "связана" с автоматически созданной формой (форма создана при старте проекта). - по нажатию кнопки ты создаешь новую форму и "связываешь" ее с переменной form2 (под это выделяется память, видим прирост памяти в диспетчере задач), получается что на экземпляр второй формы который был создан при старте приложения уже не указывает никакая переменная - это называется утечка памяти, но в данном случае проблема не в delphi, а в криворукости программиста. - затем ты делаешь free для второй формы, переменная form2 уже никуда не указывает, память помечается как свободная (но не отдается обратно системе, это не бага это фича), и при повторном нажатии на кнопку форма заново создается, память выделяется (т.к. есть свободная то у системы больше не просим, и в дипетчере задач изменения объема памяти не наблюдается). Вот так-то. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |