Как Вы параметризовали gen_server модуль?

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

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

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

5
задан mwt 15 August 2009 в 15:54
поделиться

4 ответа

Я думаю, вам не следует используйте эту функцию таким образом. Похоже, вы собираетесь использовать объектно-ориентированный интерфейс для ваших gen_servers. Для этой цели вы используете локально зарегистрированные имена - это добавляет много общего состояния в вашу программу, что является The Bad Thing .

3
ответ дан 18 December 2019 в 08:29
поделиться
-module(zed, [Name]).
-behavior(gen_server).

-export([start_link/0, init/1, handle_cast/2]).
-export([increment/0]).

increment() ->
    gen_server:cast(Name, increment).

start_link() ->
    gen_server:start_link({local, Name}, {?MODULE, Name}, [], []).

init([]) ->
    {ok, 0}.

handle_cast(increment, Counter) ->
    NewCounter = Counter + 1,
    io:format("~p~n", [NewCounter]),
    {noreply, NewCounter}.

Этот модуль у меня работает нормально:

Eshell V5.7.2  (abort with ^G)
1> S1 = zed:new(s1).
{zed,s1}
2> S1:start_link().
{ok,<0.36.0>}
3> S1:increment().
1
ok
4> S1:increment().
2
ok
-4
ответ дан 18 December 2019 в 08:29
поделиться

Я просто хочу сказать две вещи:

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

  • никогда, НИКОГДА, НИКОГДА , НИКОГДА не используйте форму, которую вы пробовали! Это пережиток старых времен, которые никогда не означали того, что вы планировали, и сейчас сильно устарели.

10
ответ дан 18 December 2019 в 08:29
поделиться

Насколько я знаю, не из коробки. WPF основан на DirectX, но поскольку WPF также поддерживается в Windows XP, он основан на DirectX 9.

Я знаю, что можно использовать DirectX 10 с WPF, но тогда ваше приложение не сможет работать в XP. .

Существует библиотека для WPF под названием Bling, которая поддерживает DirectX 10 (в Vista и Windows 7), которая может вас заинтересовать. Вы можете найти его здесь . Я не знаю, насколько он зрелый.

Кроме того, я наткнулся на этот блог (в основном на французском), в котором говорится об использовании DirectX 10 с WPF.

Наконец, в CodeProject

есть хорошее введение в использование D3DImage с DirectX . Я знаю, что это не совсем ответ на ваш вопрос, но я подумал, что все равно поделюсь им с вами. Удачи.

-module(some_module, [Param1, Param2]).

start_link() -> 
  PModule = ?MODULE:new(Param1, Param2),
  gen_server:start_link(PModule, [], []).

Param1 и Param2 будут тогда доступны во всех функциях обратного вызова gen_server.

Как упоминает Зед, поскольку start_link принадлежит параметризованному модулю, вам может потребоваться сделать следующее, чтобы вызвать его:

Instance = some_module:new(Param1, Param2),
Instance:start_link().

Я считаю это особенно уродливым стилем - код, вызывающий some_module: new / n , должен знать количество и порядок параметров модуля. Код, вызывающий some_module: new / n , также не может находиться в самом some_module . Это, в свою очередь, затрудняет горячее обновление при изменении количества или порядка параметров модуля. Вам нужно будет координировать загрузку двух модулей вместо одного ( some_module и его интерфейс / модуль конструктора), даже если вы сможете найти способ обновления, выполняя код some_module . Кстати, этот стиль несколько затрудняет поиск кодовой базы для some_module: start_link .


Рекомендуемый способ передачи параметров в gen_servers - явно через ] gen_server: start_link / 3,4 аргументы функции и сохраните их в значении состояния, которое вы возвращаете из ? MODULE: init / 1 callack.

-module(good_style).

-record(state, {param1, param2}).

start_link(Param1, Param2) ->
  gen_server:start_link(?MODULE, [Param1, Param2], []).

init([Param1, Param2]) ->
  {ok, #state{param1=Param1,param2=Param2}}.

Использование этого стиля означает, что вы не будете быть пойманным различными частями OTP, которые еще не полностью поддерживают параматизированные модули (новая и все еще экспериментальная функция). Кроме того, значение состояния может быть изменено во время работы экземпляра gen_server, но параметры модуля не могут.

Этот стиль также поддерживает горячее обновление с помощью механизма изменения кода. Когда вызывается функция code_change / 3 , вы можете вернуть новое значение состояния.

10
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

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