Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE2 (Pulsar)

Автор: A_V
Дата сообщения: 05.08.2013 10:26
Buldozer_and_Co
ну и я то-же самое имел ввиду ). галку на Project desktop поставь. в D7 это тоже в настройках было кста
Автор: Buldozer_and_Co
Дата сообщения: 05.08.2013 10:44
Да точно, в D7 ставил две галки не задумываясь )
Автор: X11
Дата сообщения: 05.08.2013 11:22

Цитата:
Решил все таки переехать на XE2 с D7


Если не секрет, почему именно DXE2, а не 3 или 4?


Цитата:
1. TImageList невозможно добавить в TDateModule

В свойствах TDateModule попробуйте поменять свойство "ClassGroup" и почитайте о нём в тырнете и/или справке. Чего-то они там накрутили с TDateModule.
Автор: A_V
Дата сообщения: 05.08.2013 12:57
насчет ClassGroup, действительно к примеру TImageList, TTimer и TMainMenu относятся к классгруппе Vcl.Controls.TControl, хотя и являются наследниками TComponent, а не TControl
Автор: Buldozer_and_Co
Дата сообщения: 05.08.2013 18:46

Цитата:
Если не секрет, почему именно DXE2, а не 3 или 4?

во первых xe2 не нужен активатор, (в случае с варезной версией )
во вторых на D7 использовал ToolBar2000 и TBX, а "наследник" spTBX есть только под XE2
Последние два проекта перетянул, а оставшиеся комилю в Д7 под виртуалкой.
Автор: XPerformer
Дата сообщения: 01.09.2013 14:57
Есть простенький процесс, который периодически делает скриншот всего экрана и сохраняет в файл.
При всех прочих равных эта программа, будучи откомпилирована в Delphi7 работает в 1.5-2 раза быстрее, чем будучи откомпилирована в Delphi XE2.
Есть какое-то объяснение, оправдывающее такое падение производительности?
Привожу код для интересующихся

[more=исходник]
Код: program DoScreenshots;

uses
Windows,
SysUtils,
Graphics,
JPEG;

{$R *.res}

// делает скриншот экрана с заданным качеством и сохраняет в папку
// имя файла соответствует Prefix-YYYY-MM-DD-HH-NN-SS.jpg
function GetScreenShot(ADirectory, APrefix: string; ACompressionQuality: Integer): string;
var
Bmp: TBitmap;
Jpg: TJpegImage;
DC: HDC;
begin
Bmp := TBitmap.Create;
Jpg := TJpegImage.Create;
try
Bmp.Height := GetSystemMetrics(SM_CYSCREEN);
Bmp.Width := GetSystemMetrics(SM_CXSCREEN);

DC := GetDC(0);
try
bitblt(Bmp.Canvas.Handle, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), DC, 0,
0, SRCCOPY);
finally
ReleaseDC(0, DC);
end;

Jpg.CompressionQuality := ACompressionQuality;
Jpg.Assign(Bmp);

ADirectory := IncludeTrailingPathDelimiter(ADirectory);
ForceDirectories(ADirectory);
Result := ADirectory + APrefix + '-' + FormatDateTime('YYYY-MM-DD-HH-NN-SS', Now) + '.jpg';

Jpg.SaveToFile(Result);
// 1. Сделано 200 скриншотов, среднее время 228,6 ms
// 2. Скомпилированный под Delphi7 выполняется в 1.5-2 раза быстрее, чем под XE2

finally
Jpg.Free;
Bmp.Free;
end;
end;

var
LInput: TLastInputInfo;
Screenshots: cardinal; // сколько сделано скриншотов в данном процессе
Ticks, delta: cardinal; // время, потраченное на создание скриншотов
IdleTime: cardinal; // время бездействия в мсек
UserIsActive: Boolean;
Seconds: cardinal;

begin
Screenshots := 0;
Ticks := 0;
Seconds := 0;
try
repeat
// определяем время бездействия
LInput.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(LInput);
IdleTime := (GetTickCount - LInput.dwTime);
UserIsActive := IdleTime <= FSettings.MaxIdleTime * 1000;

// делаем скриншот 1 раз в 10 сек
if Seconds mod 10 = 0 then begin
if UserIsActive then begin
try
delta := GetTickCount;
GetScreenShot(FSettings.ScreenshotsPath, FSettings.Prefix, FSettings.JpegQuality);
Inc(Screenshots);
Inc(Ticks, GetTickCount - delta);
// сбросим в лог статистику
if Screenshots mod 100 = 0 then begin
LogLine(Format('%d screenshots, aver. time %0.1f ms', [Screenshots, Ticks / Screenshots]));
end;
except
on E: Exception do
LogLine('Error: ' + E.Message, True);
end;
end;
end;

Sleep(1000);
Inc(Seconds);
until False;
except
on E: Exception do
LogLine('Error: ' + E.Message, True);
end;

end.
Автор: Arioch1
Дата сообщения: 01.09.2013 16:00
Скриншоты в JPG ? оригинально. Попробуй в PNG и GIF и, возможно, разными бибилиотеками и с разной силой попробуй сжимать, они могут быть разные по скорости.

Например есть Png в GraphicEx, VampyreImaging

Добавлено:
И еще, попробуй не запускать 200 раз, а запустить и внутри программы сделать 200 скриншотов - тогда разница будет?
Автор: XPerformer
Дата сообщения: 01.09.2013 16:11
jpeg- требование заказчика
я не запускаю 200 раз, там же написано - крутится процесс, в цикле каждые 10 сек делает скриншот
По существу вопроса хотелось бы услышать - есть ли существенное падение производительности проектов, перекомпилированных в более свежих версиях делфи?
Автор: A_V
Дата сообщения: 02.09.2013 07:26
XPerformer
>По существу вопроса хотелось бы услышать - есть ли существенное падение производительности проектов, перекомпилированных в более свежих версиях делфи?

бывает, при интенсивной работе со строками. но тут другой случай. для начала стоит посмотреть профайлером, что-бы понять, SaveToFile торомозит (и где именно) или еще что
Автор: XPerformer
Дата сообщения: 02.09.2013 08:23
ок, посмотрю сегодня
Автор: XPerformer
Дата сообщения: 02.09.2013 15:27
XE2:
сохранение файла - в среднем 295 мс, все остальное - 58 мс
Delphi7:
сохранение файла - в среднем 146 мс, все остальное - 60 мс
То есть в пределах экспериментальной ошибки снятие скриншота и конвертация в jpeg работает с одинаковой скоростью, а тормозит сохранение в файл через TFileStream
Вот такие пирожки
Автор: Arioch1
Дата сообщения: 02.09.2013 16:00
теперь еще осталось замерить время

1. сохранение в TMemoryStream
2.1 сохранение TMemoryStream.SaveToFile
2.2 сохранение BlockWrite(TMemoryStream.Memory )


Цитата:
конвертация в jpeg работает с одинаковой скоростью

Как раз думаю, именно она и тормозит

Попробуй другий JPEG-библиотеки.
Автор: XPerformer
Дата сообщения: 02.09.2013 16:07
Arioch1
не понял
факты говорят однозначно о другом
Автор: Arioch1
Дата сообщения: 02.09.2013 16:21
Я думаю, вы просто не угадали, когда на самом деле производится конвертация в JPEG
Но посколько точек замера я у вас подсмотреть не могу, это конечно только моё предположение.

Но тем не менее, почему бы вам не разбить сохранение на два шага, как я предложил, и не проверить.

Понимаете ли, затормозить запись в диск - это довольно непросто. Птому что ее ограничивает винчестер, а не процессор.

Впрочем, теоретически есть и еще вариант: XE2 ждёт, пока данные будут записаны, а 7 отправляет Windows'у запрос и сразу закрывается.

Добавлено:

Цитата:
SaveToFile торомозит (и где именно)

в скобочках - ключевое :-D
Автор: XPerformer
Дата сообщения: 02.09.2013 16:34
Реализация SaveToFile выглядит незамысловато:


Код: procedure TGraphic.SaveToFile(const Filename: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(Filename, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
Автор: Frodo_Torbins
Дата сообщения: 02.09.2013 16:44
XPerformer
Какой то странный у вас профилировщик. Воспользуйтесь хотя бы AQtime из комплекта студии. Он вам во всех деталях покажет, на что время тратится.
Автор: XPerformer
Дата сообщения: 02.09.2013 16:45
Frodo_Torbins

и что потом? как я смогу использовать информацию, полученную следуя вашему совету?
Автор: Arioch1
Дата сообщения: 02.09.2013 17:00

Цитата:
в разных версиях делфи я не могу

Тем, что сжатие вJPEG выполняют или разные бибилиотеки, или разные их версии.

Вроже бы исходники ставятся, если ставить Delphi + C++ Builder, но они на C++ с ассемблером - вам легче будет? :-D

Добавлено:

Цитата:
как я смогу использовать информацию


Вфясните что же все же тормозит, сжатие в JPEG или запись на диск
Автор: XPerformer
Дата сообщения: 02.09.2013 17:03
ок, выясню
Автор: XPerformer
Дата сообщения: 07.09.2013 19:41
Arioch1
померял. почти все время уходит на конвертацию bmp в jpeg
Автор: Arioch1
Дата сообщения: 07.09.2013 19:57
о чём тебе сразу и говорили

ищи другие библиотеки

возможно лучше будет вообще не использовать TBitmap и прочий VCL, а как-нибудь напрямую писать на GDI и GDI+

Или плюнуть на все, если в нужную частоту влезает, то пусть 0,35 вместо 0,2 - какая разница
Автор: XPerformer
Дата сообщения: 07.09.2013 20:06
проект сдан, заказчик не жалуется. Под 32-бита откомпилировал в D7, под 64- в Xe2
Меня интересовало, не носит ли падение производительности массовый характер, а следовательно, не рано ли сносить семерку если для задачи юникод не нужен, а скорость работы важна

Попробую еще другие библиотеки, но это уже в свободное время

Добавлено:
что характерно - если сохранять чистый bmp, который 5 мегабайт, то скорость 85 мс. То есть дело не в записи вообще
Автор: NightSpawn
Дата сообщения: 25.07.2014 04:30
Ребят, подскажите в чем может быть проблема. Delphi блокирует "собой" exe файл программы: сотворили hello world!, откомпилировали, запустили, закрыли, изменили текст, откомпилировали, облом:
[DCC Fatal Error] F2039 Could not create output file '.\Win32\Debug\Hello.exe', Unlocker'ом разблокируем файл своей программы и компилируем заново, все ок.

Запарило ей богу, беглый поиск по гуглу результата не дал, все жалуются на многопоточные приложения. Мож кто сталкивался с подобным?

Проекты лежат на диске D:\ в папке Projects\название проекта.
Windows 7 x64 Prof
Права админа есть.
Embarcadero RAD Studio XE2
Навешаны:
gExperts,
CnPack,
EurekaLog (в ее настройка она вроде бы выключена, как ее полностью выгрузить из IDE не нашел)
JEDI и JCL,
из экспертов вроде бы все.
CnPack\gExperts выключал, точно не они.
Автор: XPerformer
Дата сообщения: 25.07.2014 13:03
NightSpawn
как правило перезагрузки delphi и снятия анлокером достаточно
У вас с часами все в порядке? может, рассинхронизация
или exe-шник не завершается - то есть окна уже нет, но процесс почему-то в памяти висит
Автор: Frodo_Torbins
Дата сообщения: 25.07.2014 23:01
NightSpawn
Антивирь может мешать.
Автор: SuPriTo
Дата сообщения: 26.07.2014 19:48

Цитата:
[DCC Fatal Error] F2039 Could not create output file '.\Win32\Debug\Hello.exe'

Обычно такая ошибка возникает, если приложение не заканчивается. Запустите приложение XE2, а потом выйдите. Приложение должно закончить свою работу. Если оно не заканчивает, значит нужно нажать на отладку приложения и посмотреть в какой точке остановилось приложение. И посмотреть, как заканчивается приложение. Если что смотреть Application.Run, _Halt0. Еще вариант может быть, приложение запущено, но вы пытаетесь его компилировать. Последний вариант, это возможно приложения, которые читаю ваше приложение. Кстати в UnLocker можно посмотреть какое приложение блокирует ваш файл.
Автор: NightSpawn
Дата сообщения: 28.07.2014 02:11

Цитата:
NightSpawn как правило перезагрузки delphi и снятия анлокером достаточно У вас с часами все в порядке? может, рассинхронизация или exe-шник не завершается - то есть окна уже нет, но процесс почему-то в памяти висит

С часами все ок.


Цитата:
NightSpawn Антивирь может мешать.

Выключал\выгружал.



Цитата:
Цитата: [DCC Fatal Error] F2039 Could not create output file '.\Win32\Debug\Hello.exe' Обычно такая ошибка возникает, если приложение не заканчивается. Запустите приложение XE2, а потом выйдите. Приложение должно закончить свою работу. Если оно не заканчивает, значит нужно нажать на отладку приложения и посмотреть в какой точке остановилось приложение. И посмотреть, как заканчивается приложение. Если что смотреть Application.Run, _Halt0. Еще вариант может быть, приложение запущено, но вы пытаетесь его компилировать. Последний вариант, это возможно приложения, которые читаю ваше приложение. Кстати в UnLocker можно посмотреть какое приложение блокирует ваш файл.


Что значит ошибка компилятора "F2039 Could not create output file", я понимаю. Запускаю приложение - запускается, закрываю - закрывается, IDE показывает что приложение остановленно (завершило работу), т.е. Delphi не находится в режиме отладки моего приложения. Но при попытке откомпилировать приложение с внесенными изменениями, возникает эта ошибка компилятора.
1) Приложение 100% не запущено
2) Я не заблокировал его, открыв, например, в Restorator
3) IDE покаывается активной кнопку "Запуска приложения"

Unlocker показывает, что приложение занято bds.exe. Происходит такое, как заметил, после какого нибудь вылета приложения (необработанный или обработанный exception пойманный IDE), после этого все последующие компиляции будут происходить через "unlocker->delphi". Перезапуск Delphi спасает до следующего вылета.

Приложения самого разного рода, начиная от клиента к сетевой БД и заканчивая примитивом типа форматирования текста из разряда: регистр вверх\регистр вниз.
Автор: SuPriTo
Дата сообщения: 28.07.2014 10:09

Цитата:
Unlocker показывает, что приложение занято bds.exe

Какая у вас версия XE2? Устанавливали вы Updates. Если нет, то лучше установить.
Возможно стоит перейти на версию XE3 и выше, если есть такая возможность ...
Автор: NightSpawn
Дата сообщения: 29.07.2014 06:37

Цитата:
Цитата: Unlocker показывает, что приложение занято bds.exe Какая у вас версия XE2? Устанавливали вы Updates. Если нет, то лучше установить. Возможно стоит перейти на версию XE3 и выше, если есть такая возможность ...

Embarcadero® Delphi® XE2 Version 16.0.4504.48759
на XE3 не получилось перейти, из-за некоторых компонентов.
Автор: SuPriTo
Дата сообщения: 29.07.2014 10:00
Проверьте следующее:
1. Может быть какие-то компоненты установили, которые мешают удалять файл.
2. Проверьте права на папку проекта и файлы проекта.
3. Попробуйте откатиться на hotfix 3 (http://forum.ru-board.com/topic.cgi?forum=35&topic=49523&glp).
Интересно, что это за компоненты, которые работают только под XE2.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738

Предыдущая тема: Как сделать offline версию сайта со встроенным браузером?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.