Может Singleton-класс в DLL быть совместно использованным через процессы?

Вот способ перехода с любой начальной высоты, включая 0, к автоматической (полноразмерный и гибкий) без необходимости жесткого набора кода для каждого узла или любого пользовательского кода для инициализации: https: / /github.com/csuwildcat/transition-auto. Я полагаю, что это в основном святой Грааль для того, что вы хотите -> http://codepen.io/csuwldcat/pen/kwsdF . Просто вставьте следующий JS-файл на свою страницу, и все, что вам нужно после этого сделать, это добавить / удалить один логический атрибут - reveal="" - из узлов, которые вы хотите расширить и сжать.

Вот все, что вам нужно сделать как пользователь, как только вы включите блок кода, найденный под примером кода:

/*** Nothing out of the ordinary in your styles ***/


/*** Just add and remove one attribute and transition to/from auto! ***/

I have tons of content and I am 0px in height you can't see me...
I have tons of content and I am 0px in height you can't see me... but now that you added the 'reveal' attribute, I magically transitioned to full height!...

Вот блок кода, который нужно включить в вашу страницу, после этого все это подливка :

Перетащите этот JS-файл на свою страницу - все это просто Works ™

/ * Код для высоты: авто; Переход * /

(function(doc){

/* feature detection for browsers that report different values for scrollHeight when an element's overflow is hidden vs visible (Firefox, IE) */
var test = doc.documentElement.appendChild(doc.createElement('x-reveal-test'));
    test.innerHTML = '-';
    test.style.cssText = 'display: block !important; height: 0px !important; padding: 0px !important; font-size: 0px !important; border-width: 0px !important; line-height: 1px !important; overflow: hidden !important;';
var scroll = test.scrollHeight || 2;
doc.documentElement.removeChild(test);

var loading = true,
    numReg = /^([0-9]*\.?[0-9]*)(.*)/,
    skipFrame = function(fn){
      requestAnimationFrame(function(){
        requestAnimationFrame(fn);
      });
    },
    /* 2 out of 3 uses of this function are purely to work around Chrome's catastrophically busted implementation of auto value CSS transitioning */
    revealFrame = function(el, state, height){
        el.setAttribute('reveal-transition', 'frame');
        el.style.height = height;
        skipFrame(function(){
            el.setAttribute('reveal-transition', state);
            el.style.height = '';
        });
    },
    transitionend = function(e){
      var node = e.target;
      if (node.hasAttribute('reveal')) {
        if (node.getAttribute('reveal-transition') == 'running') revealFrame(node, 'complete', '');
      } 
      else {
        node.removeAttribute('reveal-transition');
        node.style.height = '';
      }
    },
    animationstart = function(e){
      var node = e.target,
          name = e.animationName;   
      if (name == 'reveal' || name == 'unreveal') {

        if (loading) return revealFrame(node, 'complete', 'auto');

        var style = getComputedStyle(node),
            offset = (Number(style.paddingTop.match(numReg)[1])) +
                     (Number(style.paddingBottom.match(numReg)[1])) +
                     (Number(style.borderTopWidth.match(numReg)[1])) +
                     (Number(style.borderBottomWidth.match(numReg)[1]));

        if (name == 'reveal'){
          node.setAttribute('reveal-transition', 'running');
          node.style.height = node.scrollHeight - (offset / scroll) + 'px';
        }
        else {
            if (node.getAttribute('reveal-transition') == 'running') node.style.height = '';
            else revealFrame(node, 'running', node.scrollHeight - offset + 'px');
        }
      }
    };

doc.addEventListener('animationstart', animationstart, false);
doc.addEventListener('MSAnimationStart', animationstart, false);
doc.addEventListener('webkitAnimationStart', animationstart, false);
doc.addEventListener('transitionend', transitionend, false);
doc.addEventListener('MSTransitionEnd', transitionend, false);
doc.addEventListener('webkitTransitionEnd', transitionend, false);

/*
    Batshit readyState/DOMContentLoaded code to dance around Webkit/Chrome animation auto-run weirdness on initial page load.
    If they fixed their code, you could just check for if(doc.readyState != 'complete') in animationstart's if(loading) check
*/
if (document.readyState == 'complete') {
    skipFrame(function(){
        loading = false;
    });
}
else document.addEventListener('DOMContentLoaded', function(e){
    skipFrame(function(){
        loading = false;
    });
}, false);

/* Styles that allow for 'reveal' attribute triggers */
var styles = doc.createElement('style'),
    t = 'transition: none; ',
    au = 'animation: reveal 0.001s; ',
    ar = 'animation: unreveal 0.001s; ',
    clip = ' { from { opacity: 0; } to { opacity: 1; } }',
    r = 'keyframes reveal' + clip,
    u = 'keyframes unreveal' + clip;

styles.textContent = '[reveal] { -ms-'+ au + '-webkit-'+ au +'-moz-'+ au + au +'}' +
    '[reveal-transition="frame"] { -ms-' + t + '-webkit-' + t + '-moz-' + t + t + 'height: auto; }' +
    '[reveal-transition="complete"] { height: auto; }' +
    '[reveal-transition]:not([reveal]) { -webkit-'+ ar +'-moz-'+ ar + ar +'}' +
    '@-ms-' + r + '@-webkit-' + r + '@-moz-' + r + r +
    '@-ms-' + u +'@-webkit-' + u + '@-moz-' + u + u;

doc.querySelector('head').appendChild(styles);

})(document);

/ * Код для DEMO * /

    document.addEventListener('click', function(e){
      if (e.target.nodeName == 'BUTTON') {
        var next = e.target.nextElementSibling;
        next.hasAttribute('reveal') ? next.removeAttribute('reveal') : next.setAttribute('reveal', '');
      }
    }, false);

12
задан Bobby Cannon 24 June 2009 в 13:03
поделиться

5 ответов

Вы не можете использовать синглтон для синхронизации между приложениями. Каждый из них работает в собственном пространстве приложений и из соображений безопасности не может получить доступ к памяти / объектам / т. Д. от другого без метода связи (например, удаленного взаимодействия). Чтобы синхронизировать два, им придется удаленно подключиться к третьей программе.

4
ответ дан 2 December 2019 в 21:04
поделиться

Да, синглтон можно использовать для нескольких процессов. Однако вам нужно будет воспользоваться технологией, которая поддерживает межпроцессное взаимодействие, чтобы достичь этого результата.

Самыми популярными технологиями, которые позволяют напрямую разделить ваш объект, являются Remoting и WCF.

Приведение примера совместного использования синглтона с любым из них выходит за рамки ответа SO. Но в Интернете есть множество руководств по каждому из них. Поиск в Google технологии и синглтона должен направить вас на правильный путь.

7
ответ дан 2 December 2019 в 21:04
поделиться

Чтобы добавить к ответу Кевина, ваш конструктор для вашего класса Resources действительно должен быть приватным, чтобы он был настоящим синглтоном, иначе ничто не мешает кому-то создать новый экземпляр класса Resources через конструктор. Это не решает вашу проблему, но предотвращает неправильное использование синглтона.

2
ответ дан 2 December 2019 в 21:04
поделиться

Простой вызов одноэлементного свойства в другой сборке из двух разных процессов приведет к созданию разных экземпляров этого класса.

Но вы можете легко обмениваться информацией между процессами, используя .Net Remoting или инициировать межпроцессные события, если вам нужна только простая сигнализация ( EventWaitHandle ).

[Edit:] Чтобы сделать его похожим на синглтон для вызывающих, вы можете предоставить класс, который будет внутренне использовать удаленное взаимодействие для создания экземпляра синглтона, а затем прозрачно вернуть экземпляр. Вот пример, который (я думаю) делает это: http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx

1
ответ дан 2 December 2019 в 21:04
поделиться

Есть способы сделать это, как указано выше. Но это неуклюже, если вы используете WCF или удаленное взаимодействие. Пожалуйста, попробуйте методы межпроцессной синхронизации потоков.

Для получения дополнительной информации прочтите онлайн бесплатную электронную книгу по многопоточности

http://www.albahari.com/threading/

Специально см. Конструкции межпроцессной синхронизации здесь ...

http: / /www.albahari.com/threading/part2.aspx#_Synchronization_Essentials

0
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

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