スレッド生成

スレッドを生成します。スレッドで処理が高速化する訳ではなさそう。並行して処理を行いたいときに使います。

構文
THREAD 関数名( )
引数
戻値

エラー

64個まででそれ以上のスレッドを生成するとエラーが発生します。

Error: 最大スレッド数64 を超えました

指定した値が素数かどうかを調べるのを複数のスレッドで分けてみた例。処理が高速になると思ってたけど分割したらむしろ遅くなったから高速化するためにスレッドを使うのは止めたほうがよさそう。

DEF_DLL timeGetTime(): LONG: winmm.dll

PUBLIC array[-1]
SETCLEAR(array, FALSE)

DIM num = 1693 // 素数か調べる数
DIM divCnt = 2 // 分割数(スレッドの数)
DIM range[divCnt]
RESIZE(array, divCnt)

// 等差数列
DIM a1 = 3 //初項
DIM l = INT(SQRT(num)) // 末項
l = l - IIF(isEven(l), 1, 0)
DIM d = 2 // 公差
DIM n = (l - a1) / d +1// 項数

FOR i = 1 TO divCnt + 1
	range[i-1] = a1 + ((n / divCnt) * (i - 1)) * d 
NEXT

DIM t = timeGetTime()

FOR i = 0 TO UBound(range) - 1
	THREAD isPrimes(num, i, range[i], range[i+1] - 2)
NEXT

PRINT timeGetTime() - t + "ms"

DIM flg = FALSE
FOR item IN array
	IFB item = TRUE THEN
		flg = TRUE
		BREAK
	ENDIF
NEXT

IFB flg THEN
	PRINT "素数です"
ELSE
	PRINT "素数ではありません"
ENDIF

PROCEDURE isPrimes(num, n, start = 2, end = num)
	array[n] = TRUE
	SELECT TRUE
		CASE num < 2
			array[n] = FALSE; EXIT
		CASE num = 2
			array[n] = TRUE; EXIT			
		CASE num MOD 2 = 0
			array[n] = FALSE; EXIT			
	SELEND
	FOR i = start TO end
		IFB num MOD i = 0 THEN
			array[n] = FALSE
			EXIT
		ENDIF
	NEXT
FEND

プログラム実行例

吹き出しを64個表示する

スレッド内で無限ループにしてもメインスレッドが終わるとTHREAD関数で生成したスレッドも終了するので、メインスレッドも待機させる必要があります。

SETHOTKEY(VK_ESC, EMPTYPARAM, “forceQuit”)

DIM col = 8

FOR i = 1 TO 64
	THREAD FUKI(i, ((i – 1) MOD col) * 50, INT((i – 1) / col) * 50)
NEXT

WHILE TRUE
	SLEEP(0.001)
WEND

PROCEDURE FUKI(msg, x, y)
	WHILE TRUE
		FUKIDASI(msg, x, y)
		SLEEP(0.001)
	WEND
FEND

PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. thread
結果

処理待ち

SETHOTKEY(VK_ESC, EMPTYPARAM, “forceQuit”)

PUBLIC flg = FALSE
THREAD timeCount(30)

// 何らかの処理

REPEAT
	SLEEP(0.001)
UNTIL flg

// プログラム開始から30秒(timeCountの引数)以内は実行せず待機

PROCEDURE timeCount(timeout)
	DIM t = GETTIME()
	REPEAT
		DIM tm = GETTIME() – t
		FUKIDASI(tm)
		SLEEP(0.001)
	UNTIL tm >= timeout
	flg = TRUE
FEND

PROCEDURE forceQuit()
	EXITEXIT
FEND
  1. thread