スレッド†

6 個の関数。

THREADSTART†

書式†

THREADSTART( name [, arg ... ] )

引数†

Parameter Description
name 別スレッドで実行するユーザー関数の名前(文字列)
arg 関数に渡す引数。省略できる。複数渡せば _argv[0]、_argv[1]、…になる

戻り値†

スレッドの ID(1 以上の整数)。起動できなかったときは負の値。

値 意味
1 以上 起動した。以後の THREAD* 関数にこの ID を渡す
-1 その名前の関数がない(警告 W0035)
-2 同時に動かせる数(32)を超えた
-3 unload の処理中で、新しいスレッドは作れない
-4 OS がスレッドを作れなかった
-5 このビルドはスレッドに対応していない(Emscripten)

引数が足りない・文字列でないときは、警告 W0008 / W0009 を出して -1 を返します。

解説†

指定した関数を別のスレッドで動かします。SSP とのやりとり(request)とは別に、時間のかかる処理を並行して進めたいときに使います。呼び出した側はスレッドの終わりを待たずにすぐ戻ります。

OnBoot
{
    work.done = 0
    work.id = THREADSTART('Work.Heavy', 1000000)
    '計算を始めました'
}

Work.Heavy
{
    _sum = 0
    for _i = 0; _i < _argv[0]; _i++ {
        _sum += _i
    }
    work.sum = _sum     // 結果はグローバル変数に書いておく
    work.done = 1
}

OnSecondChange
{
    if work.done {
        '計算が終わりました: ' + TOSTR(work.sum)
    }
}

スレッドの結果の受け取り方は 3 通りあります。

動き方†
制限†
unload と中断†

unload が来ると、動いているワーカーすべてに中断を求め、5 秒まで終わるのを待ちます。ワーカーは次の文の切れ目で、return と同じ形で関数を抜けます(SLEEP の待ちはすぐ戻ります)。それでも終わらないスレッド(時間のかかるシステム関数の中など)は、最後の手段として強制停止し、警告 W0034 を出します。Windows 以外では強制停止ができないため、通信などで待っているスレッドは見捨てて進みます(辞書の関数を実行中のスレッドは、終わるまで待ち続けます)。

ワーカーで長く止まる関数を使わない

強制停止はスレッドの途中の状態を壊しうる手段です。時間のかかる処理は、for / while で小さく区切るか、SLEEP を挟んで書いてください。そうすれば THREADSTOP や unload で安全に止まります。

使用例†

2 つのスレッドを起動して、両方の終わりを待ち、返り値を受け取ります。

Work.Add
{
    _argv[0] + _argv[1]
}

Work.Both
{
    _a = THREADSTART('Work.Add', 1, 2)
    _b = THREADSTART('Work.Add', 10, 20)
    _r = THREADJOIN(_a)
    _r = THREADJOIN(_b)
    TOSTR(THREADRESULT(_a)) + ',' + TOSTR(THREADRESULT(_b))   // 3,30
}

互換性†

関連項目†


THREADSTATE†

書式†

THREADSTATE( id )

引数†

Parameter Description
id THREADSTART が返したスレッドの ID

戻り値†

スレッドの状態を表す整数。

値 意味
-1 その ID のスレッドがない(THREADCLOSE で捨てた、または古い記録が消えた)
0 実行中(実行の順番待ちを含む)
1 関数を最後まで実行して終わった
2 中断された(THREADSTOP、THREADCLOSE、unload)
3 エラーで終わった(強制停止したスレッドを含む)

引数が足りない・整数でないときは、警告 W0008 / W0009 を出して -1 を返します。

解説†

スレッドが動いているか、終わったかを調べます。待たずにすぐ戻るので、OnSecondChange などで繰り返し確かめる使い方に向きます。終わるまで待ちたいときは THREADJOIN を使います。

SSP の応答を止めないために

ホストの request の中で THREADJOIN を長く待つと、SSP の応答が止まります。SSP に返す処理では、THREADSTATE で確かめて、終わっていなければ次の機会に回してください。

使用例†

OnSecondChange
{
    if THREADSTATE(work.id) == 1 {
        '終わりました: ' + TOSTR(THREADRESULT(work.id))
    }
}

互換性†

関連項目†


THREADSTOP†

書式†

THREADSTOP( id )

引数†

Parameter Description
id THREADSTART が返したスレッドの ID

戻り値†

値 意味
1 中断を求めた
0 そのスレッドはすでに終わっている
-1 その ID のスレッドがない

引数が足りない・整数でないときは、警告 W0008 / W0009 を出して -1 を返します。

解説†

スレッドに中断を求めます。終わるのを待たずにすぐ戻ります。終わりを確かめるには THREADSTATE か THREADJOIN を使います。

スレッドは次の文の切れ目(while / for の周回の切れ目を含む)で、return と同じ形で今の関数を抜け、呼び出し元の関数も同じ形で抜けて、スレッドが終わります。SLEEP や THREADJOIN で待っているスレッドは、待ちを途中でやめて戻ります。中断されたスレッドの状態は 2 になり、THREADRESULT は空の値を返します。

システム関数 1 回の呼び出しの途中(大きな正規表現、REQUESTLIB など)では止まらず、その呼び出しが終わってから止まります。

使用例†

OnClose
{
    _r = THREADSTOP(work.id)
    _r = THREADJOIN(work.id, 2000)   // 2 秒まで終わりを待つ
}

互換性†

関連項目†


THREADJOIN†

書式†

THREADJOIN( id [, timeout ] )

引数†

Parameter Description
id THREADSTART が返したスレッドの ID
timeout 待つ時間の上限(ミリ秒)。省略すると終わるまで待つ

戻り値†

値 意味
1 スレッドが終わった(すでに終わっていた場合を含む)
0 時間切れで、まだ終わっていない
-1 その ID のスレッドがない
-2 自分自身は待てない

引数が足りない・整数でないときは、警告 W0008 / W0009 を出して -1 を返します。

解説†

スレッドが終わるまで待ちます。待っている間、ほかのスレッドは動けます。待っている側のスレッドが中断を求められたときも、待ちをやめて戻ります。

終わったあとの返り値は THREADRESULT で受け取ります。

ホストの request の中で長く待たない

SSP からの request の中で THREADJOIN を長く待つと、その間 SSP の応答が止まります。SSP のウィンドウの処理が止まるだけでなく、そのスレッドから送ろうとした通信(ワーカーが呼んだ DIRECTSSTP など)は、SSP が応答できず時間切れになります。短い timeout を付けるか、THREADSTATE で確かめる使い方にしてください。

使用例†

_id = THREADSTART('Work.Add', 3, 4)
_r = THREADJOIN(_id, 1000)
if _r == 1 {
    THREADRESULT(_id)   // 7
}

互換性†

関連項目†


THREADRESULT†

書式†

THREADRESULT( id )

引数†

Parameter Description
id THREADSTART が返したスレッドの ID

戻り値†

スレッドの関数の返り値。

次の場合は空の値(VOID)を返します。

引数が足りない・整数でないときは、警告 W0008 / W0009 を出して空の値を返します。

解説†

正常に終わったスレッドの関数が返した値を受け取ります。関数が複数の候補を持つとき(ランダムに選ばれる出力)は、終わるときに選ばれた 1 つです。

返り値を受け取らずに、グローバル変数へ書く方法もあります。THREADSTART を参照してください。

使用例†

_id = THREADSTART('Work.Add', 3, 4)
_r = THREADJOIN(_id)
THREADRESULT(_id)   // 7

互換性†

関連項目†


THREADCLOSE†

書式†

THREADCLOSE( id )

引数†

Parameter Description
id THREADSTART が返したスレッドの ID

戻り値†

値 意味
0 終わっているスレッドの記録を捨てた
1 まだ動いているので中断を求めた。終わったら記録を捨てる
-1 その ID のスレッドがない

引数が足りない・整数でないときは、警告 W0008 / W0009 を出して -1 を返します。

解説†

スレッドの記録(状態と返り値)を捨てます。動いているスレッドには THREADSTOP と同じ中断を求め、終わった時点で記録を捨てます。捨てたあとは、その ID を THREADSTATE などに渡すと -1 になります。

捨てなくても、終わったスレッドの記録は 256 件を超えると古いものから消えます。結果を使い終わったスレッドは、捨てておくと記録が残りません。

使用例†

_id = THREADSTART('Work.Add', 3, 4)
_r = THREADJOIN(_id)
_v = THREADRESULT(_id)
_r = THREADCLOSE(_id)

互換性†

関連項目†