То, что вы просите, - это способ раздачи заданий, но с некоторым верхним пределом. Один простой подход к этому - использовать семафор для координации предела. Вот как я бы подошел к этому:
(let [limit (.availableProcessors (Runtime/getRuntime))
; note: you might choose limit 20 based upon your problem description
sem (java.util.concurrent.Semaphore. limit)]
(defn submit-future-call
"Takes a function of no args and yields a future object that will
invoke the function in another thread, and will cache the result and
return it on all subsequent calls to deref/@. If the computation has
not yet finished, calls to deref/@ will block.
If n futures have already been submitted, then submit-future blocks
until the completion of another future, where n is the number of
available processors."
[#^Callable task]
; take a slot (or block until a slot is free)
(.acquire sem)
(try
; create a future that will free a slot on completion
(future (try (task) (finally (.release sem))))
(catch java.util.concurrent.RejectedExecutionException e
; no task was actually submitted
(.release sem)
(throw e)))))
(defmacro submit-future
"Takes a body of expressions and yields a future object that will
invoke the body in another thread, and will cache the result and
return it on all subsequent calls to deref/@. If the computation has
not yet finished, calls to deref/@ will block.
If n futures have already been submitted, then submit-future blocks
until the completion of another future, where n is the number of
available processors."
[& body] `(submit-future-call (fn [] ~@body)))
#_(example
user=> (submit-future (reduce + (range 100000000)))
#<core$future_call$reify__5782@6c69d02b: :pending>
user=> (submit-future (reduce + (range 100000000)))
#<core$future_call$reify__5782@38827968: :pending>
user=> (submit-future (reduce + (range 100000000)))
;; blocks at this point for a 2 processor PC until the previous
;; two futures complete
#<core$future_call$reify__5782@214c4ac9: :pending>
;; then submits the job
Теперь, когда вам это нужно, вам просто нужно скоординировать выполнение самих задач. Похоже, у вас уже есть механизмы для этого. Цикл (submit-future (process-queue-item))
Обратите внимание, что более старые (1.0.x) версии компилятора Free Pascal исходники были эффективно совместимы с Turbo Pascal (так как его можно было отлаживать с помощью TP), что демонстрирует базовый Pascal возможности.
Вопрос об использовании Pascal в качестве базового языка примерно такой же, как и для C, поскольку они почти эквивалентны на уровне языка. Единственное различие заключается в количестве, универсальности и качестве компиляторов.
Я настоятельно рекомендую пойти в направлении диалекта Delphi (либо с использованием Delphi, либо Lazarus / FPC), а не возвращаться к Turbo.
DOS-измы и 16-битности серьезно ограничат вас, и почти весь диалект, свободный от DOS-измов и 16-битных кодов, поддерживается FPC или Delphi.
Turbo Pascal был одним из (если не THE) основные компиляторы эпохи DOS,
Что ж, давайте вспомним Lazarus, бесплатный клон Delphi:
http://www.lazarus.freepascal.org/index.php
и FreePascal:
Free Pascal ( aka FPK Pascal) - это 32- и 64-битный профессиональный компилятор Pascal. Он доступен для разных процессоров: Intel x86, Amd64 / x86_64, PowerPC, PowerPC64, Sparc, ARM.
Паскаль полезен как язык обучения; он иллюстрирует некоторые из более фундаментальных заповедей информатики, но с меньшей неясностью, чем C.
Установка свойства Value автоматически закодирует строку html. Это должно помочь, но вам необходимо убедиться, что ваш HTML-код является допустимым XML (XHTML).
currentReport.Element("recomendations").ReplaceNodes(XElement.Parse(myCallreports.Comments));
Изменить: Вам может потребоваться заключить введенный пользователем HTML-код в Затем вам просто нужно убедиться, что теги типа Редактировать 2 : Другой вариант - использовать XML CDATA . Оберните HTML с помощью
XElement.Parse
ожидает найти строку с как минимум начальным и конечным тегами xml. Так что это может сработать лучше:
currentReport.Element("recomendations").ReplaceNodes(XElement.Parse("<div>" + myCallreports.Comments + "</div>"));
отправляются как
.
и
]]>
,
Паскаль не используется ни для чего практического, потому что библиотека поддерживает там нет.
Что за тупица. Существует множество библиотек, которые могут использоваться Delphi, FreePascal и Lazarus.
Как говорит Макваффлестикс, есть смысл иметь упрощенную среду
«Упрощенная среда»? Это просто унизительно. Я бы сказал, что он всегда был довольно изощренным.
Я думаю, что основной причиной популярности Turbo Pascal был не язык Pascal, а IDE. Насколько я помню, с ним было действительно легко работать, это было быстро, и даже отладка доставляла удовольствие.
С другой стороны, язык Паскаль был устаревшим, поэтому Borland добавила немало вещей к языку Паскаль (и сделала их язык более похожим на Модуль-2).
Никто еще не упомянул, что TeX (и METAfont и другое TeXware) написано на Паскале.
В начале 90-х я разработал коммерческие приложения X / Motif CAD, используя собственный диалект Паскаль.
Выполняя поиск по ключевому слову «паскаль», фильтруя результаты с помощью «язык программирования» => «паскаль», вы найдете множество приложений паскаль, если не корпоративного уровня, то по крайней мере серьезных уровень программиста.
С таким количеством открытых и кроссплатформенных идей и библиотек, я думаю, что паскаль все еще жив (за исключением популярного диалекта delphi) и может выполнять практические задачи. Как следует из результатов, паскаль мог бы выполнять операционную систему, Компилятор, кроссплатформенная библиотека, программирование рабочего стола. Таким образом, кажется, что паскаль, по крайней мере, мог бы выполнять много серьезных задач, если не слишком практичных, чтобы мгновенно вернуть деньги.
В любом случае, мне нравится этот язык, хотя я знаю Я не занимался с ним серьезным программированием.