Модератор: Модераторы

NTFS писал(а):, или перестроить программу так, чтобы не требовалось определять путь к исполнимому файлу (например, хранить конфиг в /etc, переменные в /var и т.д.)

alexs писал(а):перлы вида хранения данных в ProgramFiles или ещё чего.
NTFS писал(а):во времена терабайтных винтов это не так актуально

WAYFARER писал(а):Но, допустим, при скачивании вашей программы позволяет сэкономить несколько секунд/минут
 Он давит программу куда лучше, чем upx, но, в отличие от него, не теряет каталог хранения.
 Он давит программу куда лучше, чем upx, но, в отличие от него, не теряет каталог хранения. 
WAYFARER писал(а):Но, допустим, при скачивании вашей программы позволяет сэкономить несколько секунд/минут)))
Vadim писал(а):И кто же, при этом, мешал пользоваться 7zip'ом?
#!/bin/sh
p=`(echo ${BASH_SOURCE[0]}) 2>&1`
p=${p%%:*}
d=${p%/*}
cd $d
./my_proga `pwd`После запуска программы память освободится а дисковое пространстро, нет. Постоянно запаковывать и распаковывать неудобно. Кроме того, fpc кроссплатформенный, а лазарус поддерживает несколько тулкитов. В программе тянущей за собой много картинок и мультимедии, исполняемый файл занимает относительно немного места и можно положить ещё несколько сборок бинарника сделав кроссплатформенную и кросстулкитную программу (специально для тулкитофобов). Но вспомогательные бинарники в сумме будут весить прилично, неплохо бы их пожать.Да но качаете вы программу 1 раз, а запускать будите сколько?
Да никто, но это предполагает, что пользователю придется иметь 7zip:)Vadim писал(а):И кто же, при этом, мешал пользоваться 7zip'ом?
Maxizar писал(а):А потом, при каждом старте программы тратить 0.01 сек или больше на распаковку программы..

WAYFARER писал(а):нет, наоборот затрачивается меньше времени на считывание и распаковку сжатого файла в оперативной памяти, чем на считывание неупакованного файла.
procedure TForm1.FormShow(Sender: TObject);
begin
  close;
end;
unit Unit1; 
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, process, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
var
  Form1: TForm1; 
implementation
uses performancetime;
{$R *.lfm}
Procedure RunProg(Const ProgName:String);
var
   AProcess: TProcess;
begin
   AProcess := TProcess.Create(nil);
   AProcess.CommandLine := UTF8ToSys(ProgName);
   AProcess.Options     := AProcess.Options + [poWaitOnExit];
   AProcess.Execute;
   AProcess.Free;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var Delay:TPerformanceTime;
begin
   Delay:=TPerformanceTime.Create(false);
   Delay.Start;
   RunProg(Edit1.Text);
   Delay.Stop;
   Caption:=FloatToStr(Delay.Delay);
end;
end.
unit PerformanceTime;
{  =============================================================================
 Модуль PerformanceTime содержит описание класса  TPerformanceTime, который
 позволяет измерить время выполнения куска кода. Необходимо инициализировать
 переменную типа TPerformanceTime, выполнить метод Start. проделать работу (код)
 Выполнить метод Stop, после чего в св-ве Delay будет время выполнения кода
 в секундах.
 Пример:
     T:=TPerformanceTime.Create;
     T.Start;
     Sleep(1000);
     T.Stop;
     Caption:=FloatToStr(T.Delay);//покажет время равное 1 секунде +/- погрешность
 Так же в классе есть учет погрешности за счет вызова внутренних процедур класса.
 За это отвечает параметр в конструкторе. если он True то будет учет погрешности
 (задержка самого таймера, за счет вызова процедур)
 Примечание: Позволяет измерять время выполнения кода. Если код "быстрый" можно
 использовать for I:=1 to N do (Код), после чего полученное время разделить
 на N, При этом чем выше N тем меньше будет дисперсия.
 Чем выше частота процессора, то по идее точность должна быть выше, по крайней
 мере в Windows.
 Среда разработки: Lazarus v0.9.29 beta и выше
 Компилятор:       FPC v 2.4.1 и выше
 Автор: Maxizar
 Дата создания: 03.03.2010
 Дата редактирования: 12.01.2011
 }
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils,
  {$IFDEF windows}
  Windows;
  {$ENDIF}
  {$IFDEF UNIX}
  Unix, BaseUnix;
  {$ENDIF}
  Type
    TPerformanceTime=class
      private
        FDelay    :Real;   //измеренное время в секундах
        TimerDelay:Real;   //Задержка (время) самого вычисления в секундах
        StartTime :Real;   //Время начала теста в секундах
      public
        constructor Create(EnabledTimerDelay:Boolean=True);
        property  Delay:Real read FDelay;
        procedure Start;
        procedure Stop;
   end;
  Function  GetTimeInSec:Real;   //вернет время в секундах, с начало работы ОС
implementation
function GetTimeInSec: Real;
var
  {$IFDEF windows}
  StartCount, Freq: Int64;
  {$ENDIF}
   {$IFDEF UNIX}
  TimeLinux:timeval;
  {$ENDIF}
begin
  {$IFDEF windows}
   if QueryPerformanceCounter(StartCount) then //возвращает текущее значение счетчика
    begin
      QueryPerformanceFrequency(Freq);   //Кол-во тиков в секунду
      Result:=StartCount/Freq;           //Результат в секундах
    end
  else
    Result:=GetTickCount*1000;           //*1000, т.к  GetTickCount вернет милиСекунды
  {$ENDIF}
  {$IFDEF UNIX}
   fpGetTimeOfDay(@TimeLinux,nil);
   Result:=TimeLinux.tv_sec + TimeLinux.tv_usec/1000000;
  {$ENDIF}
end;
{ TPerformanceTime }
//------------------------------------------------------------------//
constructor TPerformanceTime.Create(EnabledTimerDelay: Boolean);
var TempTime,TempValue:Real;
begin
  TimerDelay:=0;
  if EnabledTimerDelay then
   begin
    TempValue :=GetTimeInSec;    //Первый раз холостой, чтобы подгрузить нужные системные dll
                                 //Но за одно и записали в TempValue число.
    TempTime  :=GetTimeInSec;    //Теперь уже за правду записали время.
    TempValue :=TempValue-GetTimeInSec-TempTime;  //Тут пытаемся сделать работу подобной проц Stop
    TimerDelay:=GetTimeInSec-TempTime;            //подсчитали потери (погрешность) самого таймера (по идее проц Stop)
   end;
end;
//------------------------------------------------------------------//
procedure TPerformanceTime.Start;
begin
   StartTime:=GetTimeInSec;
end;
//------------------------------------------------------------------//
procedure TPerformanceTime.Stop;
begin
   FDelay:=GetTimeInSec-StartTime-TimerDelay;
end;
end.
Использования программ подобных UPX, позволяет затруднить взлом и снятия дампа программы, при ее иследовании скажем в Olly dbg.
про затруднение при взломе - это сказка... при взломе в первую очередь смотрят не упакована ли программа каким-нить упаковщиком, и только после этого ее ломают... А использование UPX видно даже не вооруженным взглядом, он даже версию свою прописывает в бинарнике
 
  Осталось узнать как обойтись без утилиты pwd

Как раз для уменьшения веса лазарусных демок смысл есть. Их много, а если пожать, то не так жаба душит. Замедление запуска на несколько миллисекунд никакой роли не играет. Жать можно из локальной менюшки. Архиваторы и инсталляторы в данном случае как "ни пришей к компилятору рукав", мало от них пользы. Если запускать пожатую демку из консоли коммандой ./fyle, то ParamStr(0) выдаст подходящую для запуска прибавку к пути.Maxizar писал(а):Смысла в использовании UPX для программ, чтобы ускорить или уменьшить файл не вижу... Для уменьшения размера при передачи используйте архиваторы и инстоляторы (Inno Setup).
coyot.rush писал(а):Имхо вполне "штатная" утилита Linux
#!/bin/sh
p=`(echo ${BASH_SOURCE[0]}) 2>&1`
p=${p%%:*}
d=${p%/*}
cd $d
./proga $PWD'/'WAYFARER писал(а):Но, допустим, при скачивании вашей программы позволяет сэкономить несколько секунд/минут)))
2. нет, наоборот затрачивается меньше времени на считывание и распаковку сжатого файла в оперативной памяти, чем на считывание неупакованного файла.
coyot.rush писал(а):Откуда такие подробности
coyot.rush писал(а):Тогда уж лучше ASprotect

Сквозняк писал(а):Как раз для уменьшения веса лазарусных демок смысл есть

Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1