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/ |