Разделение проекта на несколько солюшенов
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5536
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Разделение проекта на несколько солюшенов
Узким место в кларионе всегда была необходимость пересборки всех app в солюшене после изменений в словаре. На больших проектах это может занимать достаточно продолжительное время. Не то, чтобы прямо напрягает, можно пойти минут 15 попить чайку или поотжиматься.
Чтобы ускорить процесс, можно попробовать сделать несколько дополнительных солюшенов, включив в них разные наборы app, а затем запустить сборку параллельно. Тут есть некоторое сомнение, не будет ли конфликтов при сохранении lib файлов, на которые имеются перекрестные ссылки. Я попробовал сделать 2 солюшена из нескольких достаточно объемных app.Вот картинка после запуска их сборки параллельно.
Видно, что каждая копия среды отъедает примерно 20% мощности процессора. То есть, параллельно можно запускать 3-4 солюшена, сократив время полной пересборки проекта в 3-4 раза. То есть, условно, с 15 мин до 4-5 мин.
Чтобы ускорить процесс, можно попробовать сделать несколько дополнительных солюшенов, включив в них разные наборы app, а затем запустить сборку параллельно. Тут есть некоторое сомнение, не будет ли конфликтов при сохранении lib файлов, на которые имеются перекрестные ссылки. Я попробовал сделать 2 солюшена из нескольких достаточно объемных app.Вот картинка после запуска их сборки параллельно.
Видно, что каждая копия среды отъедает примерно 20% мощности процессора. То есть, параллельно можно запускать 3-4 солюшена, сократив время полной пересборки проекта в 3-4 раза. То есть, условно, с 15 мин до 4-5 мин.
C6/C12, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5536
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Разделение проекта на несколько солюшенов
Пока потребности что-то изменять в словаре нет, попробовал просто сборку большого проекта. Добавил в менеджере проектов список solutions, чтобы быстро открывать. Сгруппировал все app в 4 разных solutions. Время сборки общего solution со всеми app составил ~3 мин, параллельная сборка 4 небольших solution составила чуть больше 1 мин. Причем секунд на 20-25 просела на одном из solution, то есть время зависит от входящих app, его можно оптимизировать. Можно констатировать, что получаем выигрыш около 3 раз. Дальше посмотрю время сборки после изменений в словаре, когда они появятся.
C6/C12, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5536
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Разделение проекта на несколько солюшенов
Сегодня было расширение структуры данных в словаре большого проекта (2743 процедур в 28 app, 5210 полей в 287 таблицах). При распараллеливании на 4 солюшена, сборка уложилась в 3 мин.
C6/C12, ШВС, tps/btrieve.
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Разделение проекта на несколько солюшенов
Молодец, что подсчитали, после Вашего поста, подсчитал свои app в проекте - 36, было лень считать процедуры и поля ) Все собирается не более 10-15 минут, это если что то в диктонари изменил, а так и то меньше.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Разделение проекта на несколько солюшенов
Класс, если не тяжело, киньте, буду благодарен, заодно и узнаю, сколько и чего )
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Игорь Столяров
- Ветеран движения
- Сообщения: 8240
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Разделение проекта на несколько солюшенов
Я так думаю, что это не класс. Это наверно шаблон !
За теми, кто отстал, не возвращаться !
Кодекс
-
gopstop2007
- Полимат
- Сообщения: 1841
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 29 раз
- Поблагодарили: 10 раз
Разделение проекта на несколько солюшенов
Как в анекдоте, -Кто о чем, а Игорь о шаблонах
Имел в виду, классно сделано.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Игорь Столяров
- Ветеран движения
- Сообщения: 8240
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 105 раз
Разделение проекта на несколько солюшенов
А Игорь всегда о шаблонах думает, если не понимает как сделано !
За теми, кто отстал, не возвращаться !
Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5536
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 77 раз
Разделение проекта на несколько солюшенов
Как готовое решение проблематично, так как встроено в менеджер проектов, куда информация закачивается через файлы, генерируемые шаблонами при сборке проекта. Часть информации берется из базы данных менеджера проектов, часть путем парсинга clw файлов.gopstop2007 писал(а): 24 Октябрь 2025, 19:17Класс, если не тяжело, киньте, буду благодарен, заодно и узнаю, сколько и чего )
Выглядит процедура сбора информации следующим образом, не знаю, поможет ли чем.
Код: Выделить всё
rasch_r routine
DATA
lor:i long
lor:okWind long
lor:queueModuls queue, pre()
lor:nameModule string(128)
.
lor:j long
lor:okModule byte
CODE
clear(Loc:GroupStat)
clear(Fil:record,-1)
Fil:IDProject=GloV:IDProect
set(Fil:keyName,Fil:keyName)
loop
next(files)
if error() or Fil:IDProject<>GloV:IDProect
break
.
if Fil:TypeFile='ALIAS'
cycle
.
Loc:Tables+=1
clear(Ke:record,-1)
Ke:IDFile=Fil:ID
set(Ke:keyKod,Ke:keyKod)
loop
next(keys)
if error()
break
.
if Ke:IDFile<>Fil:ID
break
.
Loc:Keys+=1
.
clear(Fie:record,-1)
Fie:IDFile=Fil:ID
set(Fie:keyKod,Fie:keyKod)
loop
next(fields)
if error()
break
.
if Fie:IDFile<>Fil:ID
break
.
Loc:Fields+=1
.
.
clear(Pro:record,-1)
Pro:IDProject=GloV:IDProect
set(Pro:keyName,Pro:keyName)
loop
next(procs)
if error() or Pro:IDProject<>GloV:IDProect
break
.
Loc:Proc+=1
case Pro:ProcTempl
of 'Browse'
Loc:ProcBrowse+=1
of 'Form'
Loc:ProcForm+=1
of 'Window'
Loc:ProcWindow+=1
of 'Source'
Loc:ProcSource+=1
else
Loc:ProcOther+=1
.
if Pro:IDDLL=0
FinSoftASCIIFileName=clip(GloV:PathProects) & '\' & clip(Pro:Modules)
else
FsPrimary:ModulsDLL(Pro:IDDLL)
FinSoftASCIIFileName=clip(ModD:Paths) & '\' & clip(Pro:Modules)
.
lor:okModule=0
loop lor:j=1 to records (lor:queueModuls)
get(lor:queueModuls,lor:j)
if FinSoftASCIIFileName=lor:nameModule
lor:okModule=1
break
.
.
if lor:okModule=0
lor:nameModule=FinSoftASCIIFileName
add(lor:queueModuls)
else
cycle
.
open(FsASCIIFile)
if error()
stop(clip(FinSoftASCIIFileName) & ' - ' & error())
cycle
.
set(FsASCIIFile)
loop
next(FsASCIIFile)
if error()
break
.
if FsAF:rec=''
cycle
.
Loc:ProcStr+=1
if lower(sub(FsAF:rec,1,12))='quickwindow '
Loc:ProcWindows+=1
lor:okWind=1
elsif lower(sub(FsAF:rec,1,7))='window '
Loc:ProcWindows+=1
lor:okWind=1
elsif lor:okWind>0
FsAF:rec=left(FsAF:rec)
if sub(FsAF:rec,1,4)='END '
lor:okWind-=1
elsif sub(FsAF:rec,1,7)='STRING('
Loc:ProcContr+=1
Loc:CotnrString+=1
elsif sub(FsAF:rec,1,7)='BUTTON('
Loc:ProcContr+=1
Loc:CotnrButton+=1
elsif sub(FsAF:rec,1,4)='TAB('
Loc:ProcContr+=1
Loc:CotnrTab+=1
elsif sub(FsAF:rec,1,6)='ENTRY('
Loc:ProcContr+=1
Loc:CotnrEntry+=1
elsif sub(FsAF:rec,1,5)='LIST,'
Loc:ProcContr+=1
Loc:CotnrList+=1
elsif sub(FsAF:rec,1,6)='CHECK('
Loc:ProcContr+=1
Loc:CotnrCheck+=1
elsif sub(FsAF:rec,1,6)='RADIO('
Loc:ProcContr+=1
Loc:CotnrRadio+=1
.
.
.
close(FsASCIIFile)
.
free(lor:queueModuls)
FsPrimary:Proects(GloV:IDProect)
!Бланки FRB
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTS\*.rpt',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTS\*.rpt',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsFRB+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSU\*.rpt',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSU\*.rpt',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsFRB+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSE\*.rpt',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSE\*.rpt',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsFRB+=1
.
free(AllFiles)
!Бланки RTF
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTS\*.rtf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTS\*.rtf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsRTF+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSU\*.rtf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSU\*.rtf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsRTF+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSE\*.rtf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSE\*.rtf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsRTF+=1
.
free(AllFiles)
!Бланки Excel
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTS\*.xlf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTS\*.xlf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsExcel+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSU\*.xlf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSU\*.xlf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsExcel+=1
.
free(AllFiles)
if sub(PR:PathAll,len(clip(PR:PathAll)),1)='\'
DIRECTORY(AllFiles,clip(PR:PathAll) & 'REPORTSE\*.xlf',ff_:NORMAL)
else
DIRECTORY(AllFiles,clip(PR:PathAll) & '\REPORTSE\*.xlf',ff_:NORMAL)
.
loop lor:i=1 to records(AllFiles)
get(AllFiles,lor:i)
Loc:BlancsExcel+=1
.
free(AllFiles)
C6/C12, ШВС, tps/btrieve.
