PMG https://forum.pmg.org.ru/ |
|
Компонент TFlowVisualizer https://forum.pmg.org.ru/viewtopic.php?f=1&t=8041 |
Страница 1 из 2 |
Автор: | Dion [ 10 сен 2010 23:58 ] |
Заголовок сообщения: | Компонент TFlowVisualizer |
Привет, форумчанин! ![]() Я вдохновлен такой забавной штукой: http://www.bumptop.com/ , но у меня вовсе нет желания делать точно такую же вещь. Это конечно из области фантастики, но аспирантуру ещё никто не отменял, и подобные программы ещё могут быть темой диссертации. Так вот; на ближайшую перспективу есть задача: написать компонент. Простенький такой, называется TFlowVisualizer. Заметил наверно, пишу на Delphi RAD 2010 и думаю, что у нас будет время обменяться знаниями. Сразу добавлю о себе: сторонник оптимизации и кода, и быстродействия самой программы, к тому же, люблю комментировать, так что читать код будешь с удовольствием. А если в тебе появится желание в чем-то поправить или помочь, то это вызовет во мне бурю эмоций и настоящий восторг, и последующую благодарность. Так что всё, как говорится, в твоих руках. Сам же предлагаю свою идею, усердие, трудолюбие и исходный код на благо коллективного я. Однако замечу, что по истечении уже определённого срока, код будет внесен в государственный реестр вместе с самим текстом диссертации, если конечно защищусь, что технически довольно просто. Да и, кстати, графический интерфейс программирования OpenGL + Glut. В самое наиближайшее время опубликую часть каркаса компонента, а потом буду его постепенно дописывать и вводить новую функциональность. А, говоря об этом, нужно сказать, что пользуюсь методикой функционально-ориентированной разработки ПО (FDD), если конечно это кому-то что-то говорит. Кроме этого, есть ещё довольно большой список ограничений и требований из нормативных документов. Разумеется, у тебя должен появиться один вопросик… Но на него есть самый банальный ответ: в одиночку, программирование займет непозволительно долгий срок. И именно для того, чтобы сделать всё качественно и вовремя, здесь и будет лежать открытый код визуализатора потока данных. Искренне надеюсь, что этот эксперимент станет удачным началом долгосрочного и продуктивного сотворчества. Dion |
Автор: | olegz [ 11 сен 2010 12:48 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Спасибо за интересную ссылку. Не знал о таком. Думаю надо добавить ссылки на ютуб с демонстрацией технологии. Наверное за такими виртуальными столами будущее всех операционных систем. По крайней мере я бы таким пользовался с удовольствием. http://www.youtube.com/watch?v=SWe-TIy2Lbs |
Автор: | Dion [ 13 сен 2010 01:07 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Пока в гостях мама, дело идет медленно. Хочется побольше времени провести с ней, а то потом нас снова разделят часовые пояса и тысячи километров. Но сейчас перед сном можно чуть-чуть поразмыслить и покодить. Буду потихоньку выкладывать, хоть мне немного и неловко почему-то. Так что особо не ругайтесь, пишу, как умею. Будьте терпеливы я пишу намного медленней, чем читаю, впрочем как и любой из вас. Код: interface Uses Windows, SysUtils, Classes, UProcessData; Type PTreeDB = ^TTreeDB; { .................... Указатель на поле с данными............ } BOOTSECTOR = Record { .................... Загрузочный сектор потока задачи....... } ROOT: SIDCODE; { ....................... Идентификационный код объекта.......... } TASK: Int32; { ......................... Установленное значение идентификатора.. } TREE: PTreeDB; { ....................... Указатель на блок данных всех объектов. } DATA: Pointer; { ....................... Указатель на блок результирующих данных } End; TFlowVisualizer = class(TObject) { ....... Визуализатор потока данных............. } { FlowVisualizer - это модуль информационной системы с динамическим обновлением и модификацией функционала технологических процессов визуализации потоков данных с ядра управления. Главной полезной функцией является прием данных заданной формы, обработка, вывод графического изображения на поле визуализации и запись отчета о выполнении действий с объектами управления, именуемый алгоритмом визуализации. } Strict private FincSource: BOOTSECTOR; { .............. Загрузочный сектор приемника данных.... } FoutSource: BOOTSECTOR; { .............. Загрузочный сектор источника данных.... } FputSource: BOOTSECTOR; private function GetObjectResultBLOB( { ........ Получить отчет о выполненной задаче.... } index: Int32): { ..................... Индекс адресата данных................. } Pointer; { ............................. Указатель блока результирующих данных.. } procedure SetObjectIdentificationCode( { Задать идентификационный код объекта... } ID: SIDCODE; { ....................... Идентификатор обращения к полю данных.. } index: Int32; { ...................... Индекс получателя данных............... } NewID: Int32); { ..................... Устанавливаемое значение идентификатора } public { Группа свойств отвечает за выбор идентификационного кода объекта. Под выбором... подразумевается два типа операций. Выбор источника и получателя или дубликат.. } property incSource[ID: SIDCODE]: Int32 index 1 write SetObjectIdentificationCode; property outSource[ID: SIDCODE]: Int32 index 2 write SetObjectIdentificationCode; property putSource[ID: SIDCODE]: Int32 index 3 write SetObjectIdentificationCode; { Группа свойств отвечает за выбор результирующего поля с данными для чтения.... } property incResult: Pointer index 1 read GetObjectResultBLOB; property outResult: Pointer index 2 read GetObjectResultBLOB; property putResult: Pointer index 3 read GetObjectResultBLOB; public constructor Create; destructor Destroy; override; end; TIncomeData = packed record { ............ Входные данные (чтение файла блоками) . } ROOT: SIDCODE; { ....................... Идентификационный код объекта.......... } GATE: Word; { .......................... Тип оператора (свойства)............... } TASK: Int32; { ......................... Установленное значение идентификатора.. } end; TResultData = record { ................... Результирующие данные.................. } GATE: Word; { .......................... Тип оператора (свойства)............... } Arrow: Pointer; { ...................... Указатель на результат задачи.......... } end; TParentProcessIncomeParameter = Record { . Входные данные процесса визуализации... } TotalTime: Double; { ................... Время выполнения команды (интервал) ... } TimerFlag: LongBool; { ................. Флаг включения счетчика времени........ } FinalFlag: LongBool; { ................. Флаг выключения потока................. } ThreadHID: THandle; { .................. Дескриптор потока для управления им.... } ThreadSUS: Cardinal; { ................. Счетчик состояний потока............... } CallBackS: TProc<Cardinal>; { .......... Процедура с одним параметром (успешно). } CallBackE: TFunc<Cardinal, BOOL>; { .... Процедура с одним параметром (ошибка).. } CallBackC: TProc<Pointer, Pointer>; { ... Заполнение текстового массива данными.. } IncomeData: TIncomeData; { ............. Входные данные с субъекта управления... } ResultData: TResultData; { ............. Результирующие данные с объекта........ } End; { Функция для работы с визуализатором потока данных. } function ParentProcessThreadFunction(Parameter: Pointer): Integer; Это объявление типов данных. SIDCODE и TTreeDB лежат на другой странице. Их тоже чуть позже опубликую, а то без них непонятно. Можете не сомневаться, свойства хоть и отсутствуют тут:Delphi Sources и в тому подобных местах, но отлично работают. Кстати при "Ctrl + Shift + C" генерируется неправильный код, можете попробовать в своих проектах и улыбнуться. Компилятор помещает индекс вперед, а потом сам же и ругается на несовпадение типов. ![]() |
Автор: | Dion [ 13 сен 2010 01:09 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Вот функция для доступа к объекту. Не проверял, но должна работать. Собственно это функция порожденного потока. Тут маленький примитивный паскалевский цикл. Вложенная процедура для работы со свойствами. И немного кода. На входе три главные переменные, на выходе указатель, точнее один из трех указателей. Код: implementation
var Messages: Array of PWideChar; { .......... Массив сообщений класса................ } FlowVisualizer: TFlowVisualizer; { ....... Визуализатор потока данных............. } TreeDB: TTreeDB; { ....................... Массив с данными визуализатора......... } function ParentProcessThreadFunction(Parameter: Pointer): Integer; Label Restart; { ........................... Метка перезагрузки класса при ошибках.. } Label DoAgain; { ........................... Метка новой задачи..................... } var Frequency: Int64; { ...................... Тактовая частота процессора............ } StartTime: Int64; { ...................... Время получения команды (счетчик) ..... } FinalTime: Int64; { ...................... Время выполнения команды (счетчик) .... } DoRestart: LongBool; { ................... Флаг выполнения перезагрузки класса.... } Iteration: Cardinal; { ................... Номер выполненной задачи............... } Optimized: Double; { ..................... Множитель счетчика времени............. } { Процедура для работы со свойствами визуализатора потока.......... } procedure ExecuteProperty(ExchangeData: Pointer; OpenType: LongBool); begin if OpenType then With TIncomeData(ExchangeData^) do case GATE of 1: FlowVisualizer.incSource[ROOT] := TASK; 2: FlowVisualizer.outSource[ROOT] := TASK; 3: FlowVisualizer.putSource[ROOT] := TASK; end else With TResultData(ExchangeData^) do case GATE of 1: Arrow := FlowVisualizer.incResult; 2: Arrow := FlowVisualizer.outResult; 3: Arrow := FlowVisualizer.putResult; end end; begin Restart : { Метка для перезагрузка визуализатора потока } Iteration := 0; QueryPerformanceFrequency(Frequency); if Frequency = 0 then RunError(1); { 998 Ошибка определения частоты на многоядерных процессорах } Optimized := 1000 / Frequency; DoRestart := False; try With TParentProcessIncomeParameter(Parameter^) do begin FlowVisualizer := TFlowVisualizer.Create; CallBackC(@Messages, @TreeDB); try DoAgain : { Метка возврата к началу защищенного блока } ResultData.Arrow := nil; TotalTime := 0.0; if TimerFlag then begin { Если нужно произвести операцию связанную с таймером } QueryPerformanceCounter(StartTime); ExecuteProperty(@IncomeData, True); QueryPerformanceCounter(FinalTime); FinalTime := FinalTime - StartTime; TotalTime := FinalTime * Optimized; end else { Выполнить действия без учета времени выполнения } begin ExecuteProperty(@IncomeData, True); end; { Получение результата, вызов внешней процедуры и заморозка } ExecuteProperty(@ResultData, False); CallBackS(Iteration); ThreadSUS := SuspendThread(ThreadHID); Inc(Iteration); if not FinalFlag then { Если флаг пуст повторям действие заново } goto DoAgain; except on E: Exception do { Вызываем внешний обработчик ошибок } DoRestart := CallBackE(Iteration); end; end; finally FlowVisualizer.Free; end; if DoRestart then { Если произошла критическая ошибка, пробуем начать заново } goto Restart; Result := 0; end; |
Автор: | Dion [ 13 сен 2010 01:33 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
На вход компонента подаются данные в строго заданном формате: TIncomeData, а результирующие данные TResultData. Другого доступа к компоненту нет. Всё остальное должно быть реализовано внутри с помощью вывода графики и ввода данных с клавиатуры и мышки. Внутри класса есть одна функция и одна процедура, обе они представляют собой длинную конструкцию: Код: case SIDCODE of 0:; 1:; n-1; n:; else ; end; В зависимости от переменной TASK будет произведено действие над объектом. Действий всего два: call or save params. Грубо говоря call это вызов процедуры или функции по определённому идентификационному ключу. Сама процедура может лежать на другом юните или в bpl(dll) подключенная динамически, т.е. указатель на неё будет лежать в массиве указателей с номером TASK в папке SIDCODE. Внеси имя файла и получи ID. Вставь ID в алгоритм и он запустится. Это что-то типа run-time plugin В результате алгоритм визуализации всякий раз будет составлен из неких Int64 номеров. Вот такая идея. |
Автор: | MagicWolf [ 13 сен 2010 16:01 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Интересная технология, особенно применительно к touch screen. Но для нее надо на каждый файл делать свою уникальную иконку. Потом атрибуты файла, сортировка файлов по признакам (дата, размер). Ярлыки... Вообщем много проблем. |
Автор: | Dion [ 13 сен 2010 16:50 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Благодаря Кудрявцеву Александру Владимировичу, преподавателю мастер классов по теории решения изобретательских задач в МГТУ им. Баумана эта задача успешно решена в виде алгоритма. Воплотить его в коде довольно просто, но на это потребуется время. |
Автор: | olegz [ 13 сен 2010 20:22 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Автор молодец, продолжай, интересно смотреть на развитие идеи. |
Автор: | Da Man [ 14 сен 2010 02:15 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Dion, зачем выкладывать кусочки кода в 200 строк в каждом посте?! Имхо, гораздо лучше создать публичный свн, а здесь постить о каких-нить важных коммитах... |
Автор: | Dion [ 14 сен 2010 10:31 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Da Man Люблю людей, высказывающих своё мнение везде, где это возможно. Даже если ни одному из адресатов непонятно содержание сообщения. Угадайте, сколько людей поняли Вас? |
Автор: | Da Man [ 14 сен 2010 22:17 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Все разработчики ПО, прочитавшие это сообщение |
Автор: | MagicWolf [ 20 сен 2010 13:06 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Вот что-то подобное: http://graphics.cs.msu.ru/ru/science/re ... /3dfilesys |
Автор: | olegz [ 20 сен 2010 20:24 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Вот вот, надеюсь, что в ближайшем будущем подход к оформлению информации измениться и будут применимы новые совершенные методы работы с данными. |
Автор: | Dion [ 04 окт 2010 14:16 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Не знаю, что делать с веткой. Все дело в мааленькой проблемке. в OpenGL есть VBO и это расширение конечно "соответствует" моим ожиданиям, но D3D9 VB немного приятней в использовании. Немаловажную роль конечно сыграл тот факт, что на ноуте вместо картинки из VBO - пустой экран. |
Автор: | MagicWolf [ 04 окт 2010 16:39 ] |
Заголовок сообщения: | Re: Компонент TFlowVisualizer |
Делай на DX. Если надо можно ветку перенести. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |