酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

BREWアプリ開発者が、.NET Frameworkで安定したアプリ間通信をするにはどうしたら良いのか考えてみた

昨日、寝る前に自動売買アプリの全体像に関して考え直してみました。最初は、株価Getアプリとシグナル検出(買いか売りかを判断する)アプリは、DBだけを共有させてそれぞれの機能に特化させようかと思っていました。

DBに変更がある毎に通知を受けれれば良いのでしょうが、不可能そうなのでシグナル検出アプリは、タイマーでDBを監視するしかなさそう?

それではリアルタイムとは程遠いため、株価Getアプリからシグナル検出アプリに株価変更通知が行えないかと考えました。株価変更通知を擬似的に送ってやれば、バックテストもしやすいかなぁ……、と考えました。こんな感じ。

BREWアプリですと、アプリAの起動時とかにNotify登録をしておけば、他アプリやエクステンション(BREW拡張)からNotifyメソッドを呼ばれた時に、アプリの起動状態に関わらず通知を受けることが出来ます。

BREWアプリで、アプリB→アプリAでアプリ間通信させる方法です。(コンパイルしていないのでビルドエラーになってたら間違っていたらごめんなさい)

/* アプリAのイベントハンドラ */
static boolean AppA_HandleEvent(AppA pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
    switch(eCode)
    {
        /* アプリ起動 */
        case EVT_APP_START:
            /* AEECLSID_APPLI_BからのNotifyを受けれるように */
            /* 通知種別(dwMask)を登録しますた               */
            ISHELL_RegisterNotify(pMe, AEECLSID_APPLI_A, AEECLSID_APPLI_B, dwMask);
            return TRUE;

        /* アプリ終了 */
        case EVT_APP_END:
            /* マスクの解除をしておかないとアプリA終了後も        */
            /* Notify発生毎にアプリが起動・通知・終了されてしまう */
            ISHELL_RegisterNotify(pMe, AEECLSID_APPLI_A, AEECLSID_APPLI_B, 0x0);
            return TRUE;

        /* 通知受信 */
        case EVT_NOTIFY:
        {
            AEENotify* aeeNotify = (AEENotify*)dwParam;
            if(AEECLSID_APPLI_B == aeeNotify->cls)
            {
                /* AEECLSID_APPLI_Bからの通知を受けたときの処理 */
                return TRUE;
            }
        }
    }
}

アプリBではISHELL_Notifyを使うと通知を送ることができます。

/* Notify通知をおこなう in アプリB */
{
    /* ISHELL_NotifyするとAEECLSID_APPLI_Bを登録している */
    /* アプリ全てに対して通知がおこなわれる              */
    ISHELL_Notify(pMe, AEECLSID_APPLI_B, dwMask, pData);
}

.NETアプリでアプリ間通信させる方法は沢山あるようだけど、早くて安定してアプリ間通信する方法はどれになるんだろう……実家から帰ったらまた探してみよう