AlekXL
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору LGTeam, deks Цитата: Цитата: В OmniThreadLibrary есть куча примеров такой работы - причем и с передачей сообщений о прогресе, и с передачей в фоновый поток начальных данных, и с загрузкой результата фоновой обработки, и с параллельным разбиением задачи на несколько потоков для одновременной обработки.. | OTL -- зло, я считаю. Во-первых, без нужды завязанное на мессаджи, непереносимое. Скверно, неинтуитивно спроектированное. Я уже писал о его грехах. И примеры OTL столь же плохие. В OTL много труда вбухано, но она ужасна, как атомная война. Сейчас этот пшек пытается монетизировать свой опус за счет книги и платных вебинаров. Знаете, если фреймворк настолько неинтуитивен и сложен, что нужна книга, чтобы понять , как все это использовать, то может нафиг его? Зачем связываться с таким безблагодатным поделием? Мне пришлось пилить собственную многопоточку(и очередь тасков не через windows msg queue, а через Collections.TPriorityQueue, нативно) . Вот пример ее использования, бутстрап Код: fTaskMan:=phGetTaskManager(); fcBuildCtx:=fTaskMan.Prepare( phClassContext().Build,{$IFDEF DEBUG}'buildClassCtx'{$ENDIF} ).Schedule(); tcInitSettings:= fTaskMan.Prepare(TphSimpleFnMethodTaskImp<IphSettings>.Create(getSettings) {$IFDEF DEBUG},'getSettings'{$ENDIF}).Schedule(fcBuildCtx); fTcGetLocalizer:=TphTaskControlHelper.getGenericTaskControl<IphValuePairs>(GetLocaLizer{$IFDEF DEBUG},'getLocalizer'{$ENDIF}). Schedule(tcInitSettings); tcBootstrapModules :=fTaskMan.Prepare(procedure()begin phBqModule.Bootstrap();end {$IFDEF DEBUG},'phBqModule.Bootstrap'{$ENDIF} ).Schedule(tcInitSettings); fcInitProtocol:=fTaskMan.Prepare(self.InitInternalProtocols {$IFDEF DEBUG}, 'initInternalProtocols'{$ENDIF}).RequireComInitialzation(0).Schedule(tcInitSettings); fTcLoadCached:=fTaskMan.Prepare(LoadModuleList{$IFDEF DEBUG},'LoadModuleList'{$ENDIF}).Schedule(fTcGetLocalizer); fTcScanModules:=fTaskMan.Prepare(TModuleScanner.Create(self) as IphModuleScanner {$IFDEF DEBUG},'TModuleScanner'{$ENDIF}).RequireFinished(tcBootstrapBqModules). Schedule(tcInitSettings,ScanDone); fTcInitVerseList:=fTaskMan.Prepare( self.initVerseListEngine{$IFDEF DEBUG},'initVerseListEngine'{$ENDIF}).Schedule(tcInitSettings); TThread.Yield(); | уверяю, в отл все это выглядело бы много хуже. (по поводу TThread.Yield.. Хейтер прав, в том, что дельфи потоки запускаются не мгновенно. Они всегда создаются suspended. И запускаются не раньше, чем в AfterConstruction) deks Цитата: Arioch1 верно пишет - не стоит связываться с VCL в разных потоках. А какой смысл это делать? В чем изначальная идея создания формы в другом потоке? | ну я просто интересовался, не обдумывая это углубленно.. Например, интерфейс для плагина или скрипта, который не умеет работать асинхронно. --- еще вопрос. Оказывается, Halt в Delphi не сразу закрывает приложение, а запускает финализацию юнитов, что в принципе нежелательно (я использую halt для аварийного останова). Если кросс-платформенная функция , аналог ExitProcess(1)? | Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 20:55 16-08-2013 | Исправлено: AlekXL, 21:13 16-08-2013 |
|