2011-08-04 116 views
2

私はMATLABのコンテンツ配信サーバの統計モデルを研究しており、OOプログラミングを使用することに決めました。これはMATLABでのOOへの私の最初の進出であり、私は問題を抱えています。私はサーバーへのダウンロード接続をモデル化しようとしています。現時点では、MATLABタイマーとブール値です。タイマーが切れると、isActiveフィールドをtrueからfalseに設定します。とてもシンプルな気がしますが、今私はこれと一日以上戦っています。以下は、クラスのコードは、これまでのところです:Matlabでタイマを使用するコールバック関数

classdef dl<handle 
     properties 
      isActive = true 
      ttl = 0 
     end 
     methods 
      function this = startTimer(this, varargin) 
       this.ttl = timer('TimerFcn', @()killConnection(this), 'StartDelay',1);  
       start(this.ttl);    
      end 
     end 

     methods (Access = private) 
      function obj = killConnection(obj, varargin) 
       obj.isActive = false; 
      end   
     end 
    end 

答えて

2

私が問題を解決したのは、コールバックハンドラが宣言されたという問題でした。正確な理由は確かではありませんが、誰かが興味を持っていればもっと良い説明があります。このブログ記事http://syncor.blogspot.com/2011/01/matlabusing-callbacks-in-classdef.htmlをご覧ください。

ここでは、正常に動作するために行った変更を示します。まず私は、コールバックのための適切な構造にコールバック関数を変更:

function killConnection(event, string_arg, this) 

それから私はタイマーで異なるコールバックを宣言:

this.ttl = timer('TimerFcn', {@dl.killConnection, this}, 'StartDelay',1); 

これは私のために働きました。本当に助けてくれてありがとう:P。

+0

あなたのコードに 'dl'が何であるのか分かりませんでしたが、私はそれを使って演奏しました。この手がかりをありがとう: '{}'(私の答えを見てください)。 BTW、リンクからのソリューションは、静的メソッドでのみ動作します。 – Serg

1

私の推測でそれをしようとせず、コールバックは、静的クラスの関数であることが必要と引数リストは、タイマーのための適切なパラメータとする必要があるということです。静的クラスコールバックは、インスタンスisActiveフラグを設定するオブジェクト参照を見つける必要があります。 findobjは、ハンドルオブジェクトを使用することを選択したが、リアルタイム応答に影響する可能性があるため、クラスオブジェクトインスタンスを名前で取得する可能性があります。

this.ttl = timer('TimerFcn', @dl.killConnection, 'StartDelay',1); 


methods(Static) 
     function killConnection(obj, event, string_arg) 
     ... 
     end 
end 

ちょっと推測してください。幸運にも、最近私はこの試みを考えていたので、本当の答えに興味があります。

+0

私はあなたの運と一緒に提案するもの試してみました。私は "未定義の関数またはメソッド 'dl.killConnection'のタイプ 'タイマー'の入力引数のエラーが返されます。私が持っているのと同じ問題ですが、コールバックとして使用したい機能を認識することはできません。 – Rabid

0

---- TimerHandle.m ---------

classdef TimerHandle < handle  
    properties 
     replay_timer 
     count = 0 
    end 
    methods 
     function register_timer(obj) 
      obj.replay_timer = timer('TimerFcn', {@obj.on_timer}, 'ExecutionMode', 'fixedSpacing', ... 
       'Period', 1, 'BusyMode', 'drop', 'TasksToExecute', inf); 
     end 
     function on_timer(obj, varargin) 
      obj.count = obj.count + 1; 
      fprintf('[%d] on_timer()\n', obj.count); 
     end 
     function delete(obj) 
      delete(obj.replay_timer); 
      [email protected](); 
     end 
    end 
end 

使用法:

>> th = TimerHandle; 
>> th.register_timer 
>> start(th.replay_timer) 
[1] on_timer() 
[2] on_timer() 
[3] on_timer() 
[4] on_timer() 
[5] on_timer() 
[6] on_timer() 
[7] on_timer() 
[8] on_timer() 
[9] on_timer() 
>> stop(th.replay_timer) 
>> delete(th) 
関連する問題