Разделение проекта на несколько солюшенов

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5536
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 18 раз
Поблагодарили: 77 раз

Разделение проекта на несколько солюшенов

Сообщение finsoftrz »

Узким место в кларионе всегда была необходимость пересборки всех app в солюшене после изменений в словаре. На больших проектах это может занимать достаточно продолжительное время. Не то, чтобы прямо напрягает, можно пойти минут 15 попить чайку или поотжиматься.
Чтобы ускорить процесс, можно попробовать сделать несколько дополнительных солюшенов, включив в них разные наборы app, а затем запустить сборку параллельно. Тут есть некоторое сомнение, не будет ли конфликтов при сохранении lib файлов, на которые имеются перекрестные ссылки. Я попробовал сделать 2 солюшена из нескольких достаточно объемных app.Вот картинка после запуска их сборки параллельно.

solutins.png

Видно, что каждая копия среды отъедает примерно 20% мощности процессора. То есть, параллельно можно запускать 3-4 солюшена, сократив время полной пересборки проекта в 3-4 раза. То есть, условно, с 15 мин до 4-5 мин.
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5536
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 18 раз
Поблагодарили: 77 раз

Разделение проекта на несколько солюшенов

Сообщение finsoftrz »

Пока потребности что-то изменять в словаре нет, попробовал просто сборку большого проекта. Добавил в менеджере проектов список solutions, чтобы быстро открывать. Сгруппировал все app в 4 разных solutions. Время сборки общего solution со всеми app составил ~3 мин, параллельная сборка 4 небольших solution составила чуть больше 1 мин. Причем секунд на 20-25 просела на одном из solution, то есть время зависит от входящих app, его можно оптимизировать. Можно констатировать, что получаем выигрыш около 3 раз. Дальше посмотрю время сборки после изменений в словаре, когда они появятся.

solutins2.png
solutins2.png (7.45 КБ) 362 просмотра
C6/C12, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5536
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 18 раз
Поблагодарили: 77 раз

Разделение проекта на несколько солюшенов

Сообщение finsoftrz »

Сегодня было расширение структуры данных в словаре большого проекта (2743 процедур в 28 app, 5210 полей в 287 таблицах). При распараллеливании на 4 солюшена, сборка уложилась в 3 мин.
C6/C12, ШВС, tps/btrieve.
gopstop2007
Полимат
Сообщения: 1841
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 29 раз
Поблагодарили: 10 раз

Разделение проекта на несколько солюшенов

Сообщение gopstop2007 »

Молодец, что подсчитали, после Вашего поста, подсчитал свои app в проекте - 36, было лень считать процедуры и поля ) Все собирается не более 10-15 минут, это если что то в диктонари изменил, а так и то меньше.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5536
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 18 раз
Поблагодарили: 77 раз

Разделение проекта на несколько солюшенов

Сообщение finsoftrz »

У меня программа считает.

stat.png
C6/C12, ШВС, tps/btrieve.
gopstop2007
Полимат
Сообщения: 1841
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 29 раз
Поблагодарили: 10 раз

Разделение проекта на несколько солюшенов

Сообщение gopstop2007 »

finsoftrz писал(а): 23 Октябрь 2025, 20:23 У меня программа считает.


stat.png
Класс, если не тяжело, киньте, буду благодарен, заодно и узнаю, сколько и чего )
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8240
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 34 раза
Поблагодарили: 105 раз

Разделение проекта на несколько солюшенов

Сообщение Игорь Столяров »

gopstop2007 писал(а): 24 Октябрь 2025, 19:17Класс
Я так думаю, что это не класс. Это наверно шаблон ! :shock:
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
gopstop2007
Полимат
Сообщения: 1841
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 29 раз
Поблагодарили: 10 раз

Разделение проекта на несколько солюшенов

Сообщение gopstop2007 »

Игорь Столяров писал(а): 24 Октябрь 2025, 19:30
gopstop2007 писал(а): 24 Октябрь 2025, 19:17Класс
Я так думаю, что это не класс. Это наверно шаблон ! :shock:
Как в анекдоте, -Кто о чем, а Игорь о шаблонах :D
Имел в виду, классно сделано.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8240
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 34 раза
Поблагодарили: 105 раз

Разделение проекта на несколько солюшенов

Сообщение Игорь Столяров »

gopstop2007 писал(а): 24 Октябрь 2025, 23:16 Кто о чем, а Игорь о шаблонах
А Игорь всегда о шаблонах думает, если не понимает как сделано ! :D
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5536
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 18 раз
Поблагодарили: 77 раз

Разделение проекта на несколько солюшенов

Сообщение finsoftrz »

gopstop2007 писал(а): 24 Октябрь 2025, 19:17
finsoftrz писал(а): 23 Октябрь 2025, 20:23 У меня программа считает.


stat.png
Класс, если не тяжело, киньте, буду благодарен, заодно и узнаю, сколько и чего )
Как готовое решение проблематично, так как встроено в менеджер проектов, куда информация закачивается через файлы, генерируемые шаблонами при сборке проекта. Часть информации берется из базы данных менеджера проектов, часть путем парсинга clw файлов.
Выглядит процедура сбора информации следующим образом, не знаю, поможет ли чем.

Код: Выделить всё

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.
Ответить