OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 06:20

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Воскресенье, 01 Ноябрь, 2009 19:35 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Подсказка: сочетание абстракции типа Files.File (двоичный байтовый поток), метапрограммирования и наличия в языке нормальных нединамических структур данных.

Под "метапрограммированием" Вы опять имеете в виду использование информации о типах, привязанную к каким-то данным?
Но тогда это уже не будет работой с нетипизированными данными...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 01 Ноябрь, 2009 23:46 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Когда они лежат - они нетипизированные. Когда нужно - они поднимаются в типизированные (RECORD). Когда нужно, они обратно сливаются.

Посмотрите, как человек работал с файлом RECORD-ов. Как в старом добром Паскале. :)

viewtopic.php?p=37145#p37145


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 05 Декабрь, 2009 22:54 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Разобрался с модулями CommObxStreamsClient и CommObxStreamsServer, и сделал пример, где просто передается массив из одного BB в другой и в ответ приходит сумма массива назад. Там не озадачивался, чтобы избежать копи паста, просто чтобы рабочий получился пример. (в приложении Client и Server).

Сделал модули GridSender и GridWaiter, для передачи массивов по TCP одним большим пакетом и попробовал применить это для простой задачи, но столкнулся с иной проблемой. Когда сделал повтор операций вычисления через Actions, а не через FOR, на три порядка упала скорость вычислений!!! Не могу понять в чем причина. Такое ощущение, что FOR увеличивает нагрузку на процессор, а Actions этого не делает. При распараллеливании, приходится использовать Actions, но как сделать, чтобы они быстро работали? Как FOR.

Сделал пример SpeedTest1 и 2, чтобы было понятно, что я имею в виду. Красным выделил отличающиеся блоки.

Через 1,5 года обнаружил ерунду во вложении. Там было ложное сравнение, сделаю правильный код заявленных программ и выложу в это сообщение.


Последний раз редактировалось Иван Денисов Среда, 27 Апрель, 2011 15:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 05 Декабрь, 2009 23:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В гуёвом режиме Вы не добьётесь производительности, т.к. Action-ы крутятся раз в 50 мс, с оконными событиями.

Нужно либо собирать безгуёвый ББ и ставить просто свой цикл, либо (полу-решение) в каждом вызове Action выполнять вычисления достаточно долго (ну, миллисекунд 20-30 - среда будет терпимо притормаживать) - можете оценить процент загрузки ЦП, ну, процентов 40, может быть, задействуете.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 04:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Благодарю за ответ. Попробовал реализовать передачу по TCP через REPEAT UNTIL вместо Actions, чтобы не терять время на ожидание, но естественно это сильно подвешивает интерфейс, и загружает один из процессоров на 100%.
Как сделать, чтобы UNTIL не так сильно грузил комп? Как сделать паузу UNTIL, но не 50 мс, а скажем 5 или 1 мс?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 08:41 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Из рассылке по BlackBox

MODULE TestLong;

IMPORT Dialog, Strings, Win := WinApi;

PROCEDURE ProcessMessages;
VAR msg: Win.MSG; res: INTEGER;
BEGIN
WHILE Win.PeekMessage(msg, 0, 0, 0, Win.PM_REMOVE) # 0 DO
res := Win.TranslateMessage(msg);
res := Win.DispatchMessageA(msg)
END
END ProcessMessages;

PROCEDURE Do*;
VAR i, j: INTEGER; s: ARRAY 20 OF CHAR; BEGIN
FOR i := 0 TO 300 DO
ProcessMessages;
FOR j := 0 TO 10000000 DO
END ;
Strings.IntToString(i, s);
Dialog.ShowStatus("msg " + s)
END
END Do;

END TestLong.

REPEAT ProcessMessages; ... UNTIL....;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 09:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Большое спасибо, поместил в каждый REPEAT ProcessMessages; и интерфейс перестал зависать, нагрузка на процессор, правда, осталась по прежнему максимальной. Теперь сделаю два режима, один через Actions, для режима ожидания заданий и редких заданий, а второй с REPEAT для непрерывных вычислений. И реализую переключение с одного на другой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 19:38 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Последнее по теме
Long running command and Dialog.ShowStatus

MODULE DosKeyboard;

IMPORT Dialog, StdLog, Strings, WinApi;

VAR
trigger: BOOLEAN;

(* Josef Tempel's solution about long running commands *)

PROCEDURE ProcessMessages* (VAR interrupted: BOOLEAN);
CONST WM_MOUSEWHEEL = 522; (* only in BB1.6 *)
VAR msg: WinApi.MSG; res: INTEGER;
BEGIN
WHILE WinApi.PeekMessageW(msg, 0, 0, 0, WinApi.PM_REMOVE) # 0 DO
CASE msg.message OF
WinApi.WM_KEYDOWN, WinApi.WM_KEYLAST, WinApi.WM_KEYUP, WinApi.WM_CHAR:
interrupted := TRUE
| WinApi.WM_LBUTTONDOWN, WinApi.WM_LBUTTONUP, WinApi.WM_LBUTTONDBLCLK,
WinApi.WM_MBUTTONDOWN, WinApi.WM_MBUTTONUP, WinApi.WM_MBUTTONDBLCLK,
WinApi.WM_RBUTTONDOWN, WinApi.WM_RBUTTONUP, WinApi.WM_RBUTTONDBLCLK,
WM_MOUSEWHEEL:
(* skip *)
ELSE
res := WinApi.DispatchMessageA(msg)
END
END
END ProcessMessages;

(* The Envelope for using his solution into my programs *)

PROCEDURE Break* (): BOOLEAN;
VAR res: INTEGER; interrupted: BOOLEAN;
BEGIN
interrupted := FALSE;
ProcessMessages(interrupted);
IF ~trigger & interrupted THEN
Dialog.GetOK('Stop the running command ?', '', '', '', {Dialog.yes, Dialog.no}, res);
trigger := res = Dialog.yes;
IF trigger THEN
StdLog.String('Command aborted: Break requested by the user.'); StdLog.Ln;
END;
END;
RETURN trigger;
END Break;

PROCEDURE ResetBreak*;
BEGIN
IF trigger THEN
StdLog.String('Command aborted: Acknowledged by the program.'); StdLog.Ln;
END;
trigger := FALSE;
END ResetBreak;


(* Test of the Envolope *)

PROCEDURE Test*;
VAR i, j: INTEGER; s: ARRAY 20 OF CHAR;
BEGIN
StdLog.String('Running...'); StdLog.Ln;
FOR i := 0 TO 300 DO
IF Break() THEN ResetBreak; RETURN END;
FOR j := 0 TO 10000000 DO (* increase if your machine is faster *)
END;
Strings.IntToString(i, s);
Dialog.ShowStatus("msg = " + s)
END;
StdLog.String('End of Run'); StdLog.Ln;
END Test;


BEGIN
ResetBreak;
END DosKeyboard.

DosKeyboard.Test


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 19:59 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
divan писал(а):
Axcel писал(а):
А никто не пробовал для этого дела использовать ActiveBlackBox?
Ну он же теперь, вроде, не поддерживается и развиваться дальше не будет, а пишу я очень медленно, поэтому важно, чтобы все наработки в будущем пригодились для следующих программ, а они, вероятно, будут на новых версиях BB писаться.

Обсуждение применения Active BlackBox перенесено: viewtopic.php?p=39244#p39244


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 20:36 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Еще, чтобы не "подвисал" GUI
viewtopic.php?f=23&t=834&hilit=%D0%94%D0%B5%D0%BB%D1%8C%D1%82%D0%B0
почему то не вошедший ни в один из "официальных" патчей для BB


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Апрель, 2011 19:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Ответ по ускорению BB при создании серверных и клиентских приложений смотрите тут


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB