панель ползунка jQuery с заливкой типа индикатора выполнения

Все зависит от того, как обрабатываются вызовы объектов, и насколько им нужна защита. COM-объекты могут попросить среду выполнения защитить их от одновременного вызова несколькими потоками; те, которые не могут быть вызваны одновременно из разных потоков, поэтому они должны защищать свои собственные данные.

Кроме того, во время выполнения также необходимо, чтобы вызов объекта COM не блокировал пользовательский интерфейс, если вызов сделан из потока пользовательского интерфейса.

квартира - это место, где живут объекты, и они содержат один или несколько потоков. Квартира определяет, что происходит, когда звонят. Вызовы к объектам в квартире будут приниматься и обрабатываться в любом потоке в этой квартире, за исключением того, что вызов потоком, уже находящимся в нужной квартире, обрабатывается сам по себе (т. Е. Прямой вызов объекта).

Нити могут быть либо в однопоточной квартире (в этом случае они являются единственной нитью в этой квартире), либо в многопоточной квартире. Они указывают, когда поток инициализирует COM для этого потока.

STA в первую очередь для совместимости с пользовательским интерфейсом, который привязан к конкретному потоку. STA получает уведомления о вызовах для обработки, получая сообщение окна в скрытое окно; когда он делает исходящий вызов, он запускает модальный цикл сообщений, чтобы предотвратить обработку других оконных сообщений. Вы можете указать фильтр сообщений, который будет вызываться, чтобы ваше приложение могло отвечать на другие сообщения.

В отличие от этого все потоки MTA совместно используют один MTA для процесса. COM может запустить новый рабочий поток для обработки входящего вызова, если нет доступных потоков, вплоть до ограничения пула. Потоки исходящих звонков просто блокируются.

Для простоты мы рассмотрим только объекты, реализованные в DLL, которые объявляют в реестре о том, что они поддерживают, установив значение ThreadingModel для ключа своего класса. Существует четыре варианта:

  • Основной поток (значение ThreadingModel отсутствует). Объект создается в основном потоке пользовательского интерфейса хоста, и все вызовы направляются в этот поток. Фабрика классов будет вызываться только в этом потоке.
  • Apartment. Это указывает на то, что класс может работать в любом потоке с однопоточным режимом. Если поток, который создает его, является потоком STA, объект будет выполняться в этом потоке, в противном случае он будет создан в основной STA - если основной STA не существует, для него будет создан поток STA. (Это означает, что потоки MTA, которые создают объекты Apartment, будут маршалировать все вызовы в другой поток.) ​​Фабрика классов может вызываться одновременно несколькими потоками STA, поэтому она должна защитить свои внутренние данные от этого.
  • Free. Это указывает на класс, предназначенный для запуска в MTA. Он всегда будет загружаться в MTA, даже если он создан потоком STA, что снова означает, что вызовы потока STA будут распределены. Это потому, что объект Free обычно пишется с ожиданием того, что он может заблокировать.
  • Both. Эти классы являются гибкими и загружаются в любую квартиру, из которой они созданы. Однако они должны быть написаны так, чтобы соответствовать обоим наборам требований: они должны защищать свое внутреннее состояние от одновременных вызовов, если они загружены в MTA, но не должны блокироваться, если они загружены в STA.

Из .NET Framework просто используйте [STAThread] в любом потоке, который создает пользовательский интерфейс. Рабочие потоки должны использовать адаптер MTA, если только они не собираются использовать COM-компоненты, помеченные Apartment, и в этом случае использовать STA, чтобы избежать проблем с распределением ресурсов и масштабируемостью, если один и тот же компонент вызывается из нескольких потоков (поскольку каждый поток будет иметь ждать компонента по очереди). Все намного проще, если вы используете отдельный COM-объект для потока, независимо от того, находится ли компонент в STA или MTA.

6
задан Rio 27 June 2009 в 02:24
поделиться

1 ответ

Мне, наверное, стоило более внимательно изучить документацию slider () . Вот гораздо более простой способ сделать то, что, я думаю, вы ищете. Он уже встроен в пользовательский интерфейс jQuery. Пример ниже взят непосредственно со страницы документации jQuery slider () , на которую я ссылался выше. Ключ - это свойство range , переданное в параметры. Присвоение ему значения « min » заставит ползунок заполнить левую сторону цветом.

JavaScript:

$(function() {
    $("#slider-range-min").slider({
        range: "min",
        value: 37,
        min: 1,
        max: 700,
        slide: function(event, ui) {
            $("#amount").val('$' + ui.value);
        }
    });
    $("#amount").val('$' + $("#slider-range-min").slider("value"));
});

Разметка:

<div id="slider-range-min"></div>
7
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: