![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Суть в следующем... есть у меня компонент, имеет он 2 события - OnEnter и OnExit.
Пользователю я даю возможность в специально предоставленном Memo ввести некоторое количество строк кода на Delphi. При этом значения переменных известны, код (к примеру, OnEnter) должен отработать и вернуть те же переменные, но уже измененные, с другими значениями. При следующем наступлении события берутся уже новые значения переменных и код работает еще раз... Я динамически создал dpr-файл на Delphi, скомпилировал его программно с помощью dcc32, но вот беда - готовый exe-шник мне надо запускать 1000 и более раз в рамках однократного выполнения моей большой программы. 1000-кратный запуск занимает 100 секунд, даже если в этом exe-шнике записан лишь один оператор (a:= 1). Это очень много, надо быстрее. Какие еще есть варианты того, что пользователь ввел код, какой хочет на Delphi, а моя программа бы его выполнила? Есть подозрение, что можно с помощью dll, как думаете - даст это результат или нет. Как программно создать dll и вызывать ее функции? Писать собственный компилятор или интерпретатор уже нет сил и времени... (может у кого-то есть готовый? - грамматика: Delphi). |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Работало долго почему? 100% из-за ShellExecute. Через dll заметно быстрее будет или нет?
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Если будешь1 раз компилить DLL и 1000 раз вызывать функцию из неё, то никаких лишних телодвижений не надо будет делать. Быстрее этого сделать будет уже нельзя... Если будет тормозить - то только из-за тормозного кода, который выполняется (то что вводится в Memo)... Как вариант - модернизировать exe (в смысле компилируемый код) так, чтобы он сам выполнял 1000 раз функцию, а не 1000 раз запускать exe -------------------- С уважением, г-н Посол. |
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Огромное человеческое спасибо за помощь.
|
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Andrey_P, обратите внимание на http://www.fastreport.ru/ru/products/products.php?BID=5 может это то, что вы ищите.
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Alex не скачиваются у меня файлы оттуда почему-то..
Добавлено @ 15:06 p0s0l, а как быть, если компонентов этих с событиями OnEnter и OnExit (см. 1-й пост) в модели несколько, соответственно нужно несколько dll с разными именами (например, MyComponent1OnEnter.dll, MyComponent1OnExit.dll, MyComponent124OnEnter.dll, MyComponent124OnExit.dll и т.д.). Нужно же их прописывать в uses секции или необязательно? Когда я вызывал exe-шник, я не задумывался, а просто писал в качестве параметра ShellExecute имя файла. С dll-кой я могу сделать что-то подобное? |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Все нормально там скачивается http://www.fastreport.ru/pbc_download/fsd7.exe -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Точно, скачалось. У меня просто FlashGet глючил что-то. Спасибо за ссылки, ща посмотрю
|
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Alex, ты его случайно не покупал? Как он, нормально работает? Похоже, это действительно то, что мне нужно!
|
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Отдельно его не покупал, но уже два года пользуюсь построителем отчетов FastReport, в который входит FS притензий к FS у меня небыло хотя иногда довольно сложные выражения расчетов на нем писались
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Сделал я по 2 библиотеки для каждого компонента, из своего кода (программно) их компилирую примерно так:
CreateProcess (nil, PChar ('dcc32.exe ' + FileName + '.dpr'), nil, nil, False, CREATE_NEW_PROCESS_GROUP, nil, PChar (Directory), Si, P); Компилируется один раз за все время выполнения модели, в самом начале, так что время компиляции для меня некритично. Затем для каждого компонента (после явной загрузки библиотек в память) я нахожу адреса процедур CodeExecute и выполняю эти процедуры каждый раз при наступлении события OnEnter и OnExit. Для 200 событий программа работает секунд 10 примерно, даже если в коде процедуры (в dll-ке) всего один оператор. Так что ощутимого улучшения по сравнению с ShellExecute я не получил. Что делать? Уже руки опускаются |
|||
|
||||
| Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 6 Всего: 162 |
Я конечно не спец в этом вопросе, но я бы начал копать все же в сторону FS. Так как он встроен и очень активно используется в FastReport и тормозов я там не замечал
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
| Andrey_P |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 22.12.2003 Где: Томск Репутация: нет Всего: нет |
Его еще купить надо
|
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
100% ты что-то неправильно сделал. Покажи текст dpr (длл-ки), который ты компилишь с помощью dcc32, и код загрузки DLL и вызова процедур из DLL...
Если у тебя 100 событий, значит, либо нужно сделать 100 экспортируемых процедур в 1 DLL, либо сделать 100 DLL (первый вариант определенно лучше). Загружаешь библиотеку с помощью LoadLibrary, получаешь адрес функций (GetProcAddress), потом когда надо их вызываешь. Тормозов при вызове не будет. -------------------- С уважением, г-н Посол. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |