0

初期化のために特定の API を 1 回だけ呼び出す必要がある場合があります。その後、スレッドは他のメソッドを呼び出すことができます。vuser_init.c には、次のようなものがあります。

static volatile int initOnlyOnce = 0;
static volatile int initComplete = 0;
int iStatus;

if (1!=initOnlyOnce ) {
        initOnlyOnce =1;
        lr_output_message("Before, initComplete = %d", initComplete );
       iStatus = Initialize(); // product API call 
       initComplete = 1;
        lr_output_message("After, initComplete = %d", initComplete );
       if (1 != iStatus ) {
           lr_error_message("Initialize returns %d on %s.",iStatus,szLoadGenerator);
           srand(time(NULL));
       } 
    }

シナリオを実行すると、最初のスレッドが両方を出力します。

Before, initComplete = 0 

に続く

After, initComplete = 1

残りのテストはそのスレッドで正しく行われます。ただし、次のスレッドは「エラー -- メモリ違反: 例外 ACCESS_VIOLATION を受信しました」で失敗します。これは、初期化が完了していないか、initComplete が 0 である前に後続のメソッドを実行したためです。他の各スレッドのログには、「Before, initComplete = 0 " を最後の行にします。これらの変数を static volatile として定義したので、

initOnlyOnce = 1

最初のスレッドがそれを呼び出した直後に、その後このコード ブロックが再び入力されることはありません。ただし、Vugen はスレッドと同じではないようです。各 vuser_init.c は実行中の他の Vugen から独立しているため、変数は static volatile と宣言されていますが、状態は共有されません。

回避策はありますか? 基本的に、vuser_init の前身となるシングルトンが必要です。

4

2 に答える 2

1

仮想ユーザー番号変数を使用して、番号が 1 かどうかを確認します。

PCODE (初期化)

If (仮想ユーザー変数の値 == 1) { 初期化コードを実行します。}

したがって、変数を作成してから、初期化のみを処理する単一の仮想ユーザーを割り当ててから終了する必要があります。このユーザーを単独でグループに配置し、他のユーザーが開始する前に終了することもできます。

必要に応じて、VUSER_INIT() の前に開始するようにスケジュールされた他の関数を追加できます。右側の関数リストに関数を追加し、ランタイム設定に移動して、vuser_init() の前に関数を 1 回実行するようにスケジュールします。

于 2013-03-19T20:26:54.963 に答える
1

LoadRunner が仮想ユーザーを実行する方法を理解するのはそれほど簡単ではありません。

ほとんどの場合、vu は特別な MMDRV プロセスの下でスレッドとして実行されます。MMDRV プロセスは約 50 のスレッドを実行し、LR エンジンは別の MMDRV プロセスを開始し、再び 50 のスレッドを実行します。(VUsers をそれぞれプロセスとして実行することもできます。実行時の設定を確認してください)。

また、テストに LoadGenerators がある場合、これらは異なるコンピューターで実行されており、他のマシンで実行されている vuser の数を知る方法がありません。

James が述べたように、コードで実行する場合は、VUserID を「チェック」として使用するのが最適なオプションです。VUserID を「VUserID」という新しいパラメーターとして取得し、タイプを VUserID として選択します。lr_eval_string("{VUserID}")その後、他のパラメーターと同様にこれを使用できます。

もう 1 つのオプションは、1 つのスクリプトが最初に実行され、次に他のスクリプトが実行されるモードでシナリオを実行することです。

于 2013-03-25T19:52:39.910 に答える