1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Многопоточность Precomp

Тема в разделе "Алгоритмы сжатия", создана пользователем Aurigda, 23 фев 2017.

  1. Старожил

    Регистрация:
    31 янв 2015
    Сообщения:
    12
    Симпатии:
    0
    Как реализовать? 8 потоков процессора - 8 запущенных процессов precomp'а.
     
  2. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    907
    Симпатии:
    664
    Aurigda,
     

    Вложения:

    Adil нравится это.
  3. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    При отмене установки с использованием precompmt инсталятор сначала долго думает, потом вылетает с ошибкой. На примере этого:
     

    Вложения:

  4. Ветеран Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    465
    Симпатии:
    184
    Пол:
    Мужской
    L-e-o-N, потому что при отмене нужно килять процесс precomp64.exe
     
  5. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    До возвращения 1 из ProgressCallback, или после?
     
  6. Ветеран Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    465
    Симпатии:
    184
    Пол:
    Мужской
    L-e-o-N,


    Код (Text):

    var
      i:integer;

    ..

      if (CurStep=ssPostInstall) and ISDoneError then begin
      Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);

     
     
  7. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    907
    Симпатии:
    664
    Mickey1s, это только убьет процесс при ошибке
    if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);

    При отмене установки на примере ISDone0.6final

    procedure CancelButtonOnClick(Sender: TObject);
    begin
    SuspendProc;
    if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=ISDoneCancel;
    #ifdef PrecompMt
    if not IsWin64 then begin
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
    end else begin
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Precomp64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
    DelTree(ExpandConstant('{app}\'), True, True, True);
    end;
    #endif

    ResumeProc;
    end;
     
    Последнее редактирование: 15 апр 2017
    agent555 нравится это.
  8. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    На сколько я понимаю эта команда убьет все процессы, или только один (если так то нужно вызывать до тех пор пока не останется не одного процесса)?
     
  9. Ветеран Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    465
    Симпатии:
    184
    Пол:
    Мужской
    L-e-o-N, все
     
  10. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Есть ли способ регулировать параметры с которыми запускается прекомп? (-intense -t- и т. д.)
     
  11. Ветеран Модератор

    Регистрация:
    11 июн 2012
    Сообщения:
    465
    Симпатии:
    184
    Пол:
    Мужской
    L-e-o-N, пока что нет
     
  12. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Всеравно вылетает, только теперь не ждет (процессы убивает)
     
  13. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Можешь скинуть весь скрипт, чтобы я посмотрел (или хотя бы секцию Code)?
     
  14. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    907
    Симпатии:
    664
    L-e-o-N,
    #define PrecompMt
    [Setup]

    [Files]
    #ifdef PrecompMt
    Source: Include\cls-precompmt\cls-precompmt.dll; DestDir: {tmp}; Flags: dontcopy
    Source: Include\cls-precompmt\precomp.exe; DestDir: {tmp}; Flags: dontcopy
    Source: Include\cls-precompmt\precomp64.exe; DestDir: {tmp}; Flags: dontcopy
    #endif

    Код (Text):


    procedure CancelButtonOnClick(Sender: TObject);
    begin
      SuspendProc;
      if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=ISDoneCancel;
      #ifdef PrecompMt
      if not IsWin64 then begin
      Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
      end else begin
      Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM Precomp64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
      DelTree(ExpandConstant('{app}\'), True, True, True);
      end;
      #endif
      ResumeProc;
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      #ifdef PrecompMt
      ExtractTemporaryFile('cls-precompmt.dll');
      ExtractTemporaryFile('precomp.exe');
      ExtractTemporaryFile('precomp64.exe');
      SaveStringToFile(ExpandConstant('{tmp}\cls-precompmt.ini'), '[CLS]'+#13#10+'Threads=75%'+#13#10+'Brute=0'+#13#10+'Temp='+ExpandConstant('{tmp}'), True);
      #endif
    end;

    if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\data-1.arc'), ExpandConstant('{app}\'), '', false, 'pass', ExpandConstant('{tmp}\cls-precompmt.ini'), ExpandConstant('{app}'), notPCFonFLY{PCFonFLY}) then break;
     
  15. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Теперь установка просто зависает (Директория с программой не полностью очищается, остаются открытые файлы, но поскольку процесс снят установка не продолжается)

    procedure ISDoneCancelButtonOnClick(hBtn:HWND);
    var
    i : integer;
    begin
    SuspendProc;
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
    Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM pzlib.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
    DelTree(ExpandConstant('{app}\'), True, True, True);
    ISDoneCancel:=1;
    ResumeProc;
    end;
     
  16. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Неужели никто не поможет, у кого то должно ведь работать.:help::sorry:
     
  17. Ветеран Проверенный

    Регистрация:
    18 июн 2011
    Сообщения:
    907
    Симпатии:
    664
    L-e-o-N, так ты дай больше информационный а не куски
    1 укажи метод сжатия батник что в нем и в arc.ini и версию файлов pzlib precomp srep
    2 что за скрипт ты используеш для распаковки
     
  18. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    1.pzlib:m2:x:s:r9:t100p:st100p:ct100p+precompmt+msc:wav=1:raw=1:ddsDXT=1:ddsRAW=0:mp3=1:f:lzma,bt4,lc4,lp0,pb2,fb273:tak=9:dxt=2+srep:l256:a1:m5f+lzma:d200m:fb=273:mf=bt4:mc=1000000:lc=4:lp=0
    arc.ini:
    [External compressor:srep]
    ;options = l%d (minimal match length, default=512)
    header = 0
    packcmd = srep {options} $$arcdatafile$$.tmp $$arcpackedfile$$.tmp
    unpackcmd = srep -d - - <stdin> <stdout>
    [External compressor:msc]
    header = 0
    packcmd = msc c -v {options} -t=4 $$arcdatafile$$.tmp $$arcpackedfile$$.tmp
    unpackcmd = MSC_Unpack.exe $$arcpackedfile$$.tmp $$arcdatafile$$.tmp
    [External compressor:pzlib]
    header = 0
    packcmd = pzlib e {options} - -o - <stdin> <stdout>
    unpackcmd = pzlib d -t100p - -o - <stdin> <stdout>
    батника у меня нет, у меня exe программа генерирует команду на основе файла конфирурации
    pzlib - v3 (последний релиз)
    precomp - 0.4.4 (0.4.5, 0.4.6 не использую из за того что в этой библиотеке нельзя отключить упаковку mp3, и на некоторых mp3 файлах ошибка crc)
    -srep - 3.9.2 beta
    Скрипт я брал где то с этого форума (лет два назад), но значительно его переделал, использую ISDone 0.6f
     
  19. Пользователь

    Регистрация:
    3 дек 2016
    Сообщения:
    102
    Симпатии:
    8
    Пол:
    Мужской
    крайне не рекомендую использовать PrecompMT в репаках, у многих кто будет ставить возникнет проблема с прогрессбаром, в играх с большим весом прогрессбар будет 20-30 минут висеть на месте, а потом рывками прыгать и опять застревать, а от юзеров у кого двухъядерный процессор ожидайте гневных комментов и проклинаний :D
     
  20. Ветеран

    Регистрация:
    1 дек 2015
    Сообщения:
    177
    Симпатии:
    56
    Пол:
    Мужской
    Я использую precompmt после pzlib-а, точнее все что можно разожмет pzlib, а в конце то что останется precompmt а поскольку остается очеь мало (иногда вообще ничего) то precomp достаточно быстро все обрабатывает.
    Но если некто не поможет то придется отказатся от него.
     

Поделиться этой страницей