14. Queue
queueオブジェクトは、データキュー機能を提供する組み込みオブジェクトです。
機能概要:
- FIFOキュー機能を提供します。
- キューに格納する要素として任意文字列および任意数値をサポートします。
制限事項:
- 同時使用可能なキューインスタンス数は
8
です。 - 本機能はNEQTO Engine for Linux専用の拡張オプションです。
キューサイズ設定、インスタンス数に応じて、システムメモリ(RAM)を消費します。
queue Global Object
Methods()/Properties | Summary | Version | Note |
---|---|---|---|
queue.create() | キューインスタンスを生成します。 | 00.02.00+ |
queue.create(size)
キューインスタンスを生成します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
size | number | mandatory | キューサイズ[KB]を指定します。 設定範囲: 1~512 | 範囲外の場合は、最も近い有効値に丸められます。 |
return | {FIFO} | - | {FIFO} : 生成された{FIFO} | 異常が発生した時は、例外となります。 |
キューに格納可能な要素数について
キューに割り当てられたバッファには、要素データが隙間なく格納されます。そのため、要素サイズが可変長の場合、キューに格納可能な要素数は増減します。したがって、想定される要素の最大サイズと最低限格納が必要な要素数からキューサイズを決定します。
1要素が消費する最大データサイズは「最大任意文字列サイズ
+ 12バイト
」となります。
必要となるキューサイズは「1要素で消費する最大データサイズ
× 最低限格納が必要な要素数
」となります。
{FIFO}
Methods()/Properties | Summary | Version | Note |
---|---|---|---|
.push() | FIFOキューに要素を追加します。 | ||
.pop() | FIFOキューから要素を取り出します。 | ||
.getCount() | FIFOキューに格納されている要素数を取得します。 | ||
.reset() | FIFOキューを初期化します。 | ||
.release() | FIFOキューを解放します。 |
Details
.push(str[,num])
FIFOキューに要素を追加します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
str | string, undefined | mandatory | 任意文字列 undefinedを指定した場合、空文字の扱いとなります。 | |
num | number | optional | 任意数値 デフォルト値は0となります。 | |
return | boolean | - | true : 成功 false : 失敗 | 異常が発生した時は、例外となります。 |
.pop()
FIFOキューから要素を取り出します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | {Element}, null | - | {Element}: 最も古い要素が返却されます。 null: 要素なし |
{Element}
Name | Type | Summary | Note |
---|---|---|---|
.str | string | 任意文字列 | |
.num | number | 任意数値 |
.getCount()
FIFOキューに格納されている要素数を取得します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | number | - | 要素格納数 |
.reset()
FIFOキューを初期化します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | undefined | - | - |
.release()
FIFOキューを解放します。
Name | Type | M/O | Summary | Note |
---|---|---|---|---|
return | undefined | - | - |
オブジェクトの使用例
Sample 1
基本的なFIFOキューのサンプルです。
var fifo = queue.create(4); //4KB
for(var i=0; i<10; i++) {
var str = 'TestData' + i;
var ret = fifo.push(str);
if(ret == false) { //overflow
print(`IN${i}: Full`);
} else {
print(`IN${i}: cnt=${fifo.getCount()}`);
}
}
var cnt = 0;
while(1) {
var obj = fifo.pop();
if(obj) {
print(`OUT${cnt++}: str=${obj['str']}, cnt=${fifo.getCount()}`);
} else {
print('Empty');
break;
}
}
fifo.release();
Sample 2
FIFOキューを活用して、数値演算処理するサンプルです。
var fifo = queue.create(12); //12KB
for(var i=0; i<1000; i++) {
var ret = fifo.push(undefined, i);
if(!ret){ //overflow
print(`IN${i}: Full`);
} else {
print(`IN${i}: cnt=${fifo.getCount()}`);
}
}
var cnt = 0;
var total = 0;
while(1) {
var obj = fifo.pop();
if(obj) {
print(`OUT${cnt++}: num=${obj['num']}, cnt=${fifo.getCount()}`);
total += obj['num'];
} else {
print('Empty');
break;
}
}
print(`Sum of 0 to 999: ${total}`);
fifo.release();
Sample 3
FIFOキューを活用して、シーケンス分岐処理を構成するサンプルです。
var fifo = queue.create(1); //1KB
var seqName = [ //seq
"init", //0
"push", //1
"check", //2
"exit" //3
];
var seqTbl = [
//seq, arg
[ 0, "" ],
[ 1, "abcdefg" ],
[ 2, "" ],
[ 3, "" ]
];
for(var i=0; i<seqTbl.length; i++) {
var ret = fifo.push(seqTbl[i][1], seqTbl[i][0]);
if(!ret) { //overflow
print(`IN${i}: Full`);
} else {
print(`IN${i}: cnt=${fifo.getCount()}`);
}
}
var act = true;
var tmp = '';
while(act) {
obj = fifo.pop();
if(obj) {
var seq = obj['num'];
var arg = obj['str'];
print('seq:', seqName[seq], arg);
switch(seq) {
case 0: //init
tmp = '';
break;
case 1: //push
tmp = tmp + arg;
break;
case 2: //check
print(tmp, tmp.length);
break;
case 3: //exit
act = false;
break;
default:
print('Unknown');
break;
}
}
}
fifo.release();
Updated: 2025-01-29