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

Aurigda

Новичок
Как реализовать? 8 потоков процессора - 8 запущенных процессов precomp'а.
 

L-e-o-N

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

Вложения

Mickey1s

Ветеран
Модератор
L-e-o-N, потому что при отмене нужно килять процесс precomp64.exe
 

Mickey1s

Ветеран
Модератор
L-e-o-N,


Код:
var
  i:integer;

..

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

vint56

Ветеран
Проверенный
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;
 
Последнее редактирование:

L-e-o-N

Старожил
L-e-o-N,


Код:
var
  i:integer;

..

  if (CurStep=ssPostInstall) and ISDoneError then begin
  Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM precomp.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
На сколько я понимаю эта команда убьет все процессы, или только один (если так то нужно вызывать до тех пор пока не останется не одного процесса)?
 

L-e-o-N

Старожил
Есть ли способ регулировать параметры с которыми запускается прекомп? (-intense -t- и т. д.)
 

L-e-o-N

Старожил
Всеравно вылетает, только теперь не ждет (процессы убивает)
 

L-e-o-N

Старожил
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;
Можешь скинуть весь скрипт, чтобы я посмотрел (или хотя бы секцию Code)?
 

vint56

Ветеран
Проверенный
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

Код:
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;
 

L-e-o-N

Старожил
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

Код:
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;
Теперь установка просто зависает (Директория с программой не полностью очищается, остаются открытые файлы, но поскольку процесс снят установка не продолжается)

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;
 

L-e-o-N

Старожил
Неужели никто не поможет, у кого то должно ведь работать.:help::sorry:
 

vint56

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

L-e-o-N

Старожил
L-e-o-N, так ты дай больше информационный а не куски
1 укажи метод сжатия батник что в нем и в arc.ini и версию файлов pzlib precomp srep
2 что за скрипт ты используеш для распаковки
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
 

Pipocooling

Участник
крайне не рекомендую использовать PrecompMT в репаках, у многих кто будет ставить возникнет проблема с прогрессбаром, в играх с большим весом прогрессбар будет 20-30 минут висеть на месте, а потом рывками прыгать и опять застревать, а от юзеров у кого двухъядерный процессор ожидайте гневных комментов и проклинаний :D
 

L-e-o-N

Старожил
крайне не рекомендую использовать PrecompMT в репаках, у многих кто будет ставить возникнет проблема с прогрессбаром, в играх с большим весом прогрессбар будет 20-30 минут висеть на месте, а потом рывками прыгать и опять застревать, а от юзеров у кого двухъядерный процессор ожидайте гневных комментов и проклинаний :D
Я использую precompmt после pzlib-а, точнее все что можно разожмет pzlib, а в конце то что останется precompmt а поскольку остается очеь мало (иногда вообще ничего) то precomp достаточно быстро все обрабатывает.
Но если некто не поможет то придется отказатся от него.
 
Сверху