OberonCore
https://forum.oberoncore.ru/

Как сделать, чтобы программа работала на обоих процессорах?
https://forum.oberoncore.ru/viewtopic.php?f=31&t=1937
Страница 3 из 3

Автор:  Geniepro [ Воскресенье, 01 Ноябрь, 2009 19:35 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Илья Ермаков писал(а):
Подсказка: сочетание абстракции типа Files.File (двоичный байтовый поток), метапрограммирования и наличия в языке нормальных нединамических структур данных.

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

Автор:  Илья Ермаков [ Воскресенье, 01 Ноябрь, 2009 23:46 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Когда они лежат - они нетипизированные. Когда нужно - они поднимаются в типизированные (RECORD). Когда нужно, они обратно сливаются.

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

viewtopic.php?p=37145#p37145

Автор:  Иван Денисов [ Суббота, 05 Декабрь, 2009 22:54 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессор

Разобрался с модулями CommObxStreamsClient и CommObxStreamsServer, и сделал пример, где просто передается массив из одного BB в другой и в ответ приходит сумма массива назад. Там не озадачивался, чтобы избежать копи паста, просто чтобы рабочий получился пример. (в приложении Client и Server).

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

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

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

Автор:  Илья Ермаков [ Суббота, 05 Декабрь, 2009 23:28 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

В гуёвом режиме Вы не добьётесь производительности, т.к. Action-ы крутятся раз в 50 мс, с оконными событиями.

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

Автор:  Иван Денисов [ Воскресенье, 06 Декабрь, 2009 04:00 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

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

Автор:  Штирлиц [ Воскресенье, 06 Декабрь, 2009 08:41 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Из рассылке по 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 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Большое спасибо, поместил в каждый REPEAT ProcessMessages; и интерфейс перестал зависать, нагрузка на процессор, правда, осталась по прежнему максимальной. Теперь сделаю два режима, один через Actions, для режима ожидания заданий и редких заданий, а второй с REPEAT для непрерывных вычислений. И реализую переключение с одного на другой.

Автор:  Штирлиц [ Воскресенье, 06 Декабрь, 2009 19:38 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Последнее по теме
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 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

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

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

Автор:  Штирлиц [ Воскресенье, 06 Декабрь, 2009 20:36 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессорах?

Еще, чтобы не "подвисал" 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 ]
Заголовок сообщения:  Re: Как сделать, чтобы программа работала на обоих процессор

Ответ по ускорению BB при создании серверных и клиентских приложений смотрите тут

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/