スレッド生成

本ページには広告が含まれています。

スレッドを生成します。処理を並行して行いたいときに使います。

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

エラー

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

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

Internet Explorerのポップアップを自動的に閉じる

UWSC
THREAD popup()

// スレッドを生成した後にInternet Explorerの処理を記述

PROCEDURE popup()
	DIM ID
	WHILE TRUE
		TRY
			ID = GETID("Web ページからのメッセージ", "#32770")
			IF CLKITEM(ID, "OK", ITM_BTN) = TRUE THEN PRINT "Web ページからのメッセージ"
			ID = GETID("Windows Internet Explorer", "#32770")
			IF CLKITEM(ID, "このページから移動", ITM_BTN) = TRUE THEN PRINT "このページから移動"
			ID = GETID("Internet Explorer", "IEFrame")
			IF CLKITEM(ID, "Web ページの回復", ITM_BTN) = TRUE THEN PRINT "Web ページの回復"
			ID = GETID("Internet Exokirer", "IEFrame")
			IF CLKITEM(ID, "すべてのコンテンツを表示", CLK_BTN) = TRUE THEN PRINT "すべてのコンテンツを表示"
		EXCEPT
		ENDTRY
		SLEEP(3.000)
	WEND
FEND

プログラム実行例

func関数のflg=TRUE以前に並行して行いたい処理を記述。今回は3秒待機するプログラム。

func関数の処理が完了するとループを抜けて、メインルーチンの続きが実行されます。

UWSC
PUBLIC flg = FALSE

THREAD func()

// flg=TRUEになるまで待機
REPEAT
	SLEEP(0.001)
UNTIL flg

// 以下にfuncが終わってから実行する処理を記述

FUKIDASI("スレッドの処理が完了しました")
SLEEP(1.000)

PROCEDURE func()
	// ↓並行させたい処理
	FUKIDASI("3秒待ちます")
	SLEEP(3.000)
	FUKIDASI()
	// ↑並行させたい処理
	flg = TRUE
FEND
使用関数

func1とfunc2の処理が終わるまで待機します。

arrayProductは配列の積を求める関数で、全ての配列がTRUEになるまで待ちます。

FALSEは0でTRUEは0以外の数値なので、FALSEがなくなれば積は0以外になりREPEAT-UNTILを抜けることができます。

UWSC
PUBLIC flg[1]

SETCLEAR(flg, FALSE)

THREAD func1()
THREAD func2()

REPEAT
	SLEEP(0.001)
UNTIL arrayProduct(flg)

FUKIDASI("スレッドの処理が完了しました")
SLEEP(1.000)

PROCEDURE func1()
	FUKIDASI("3秒待ちます")
	SLEEP(3.000)
	FUKIDASI()
	flg[0] = TRUE
FEND

PROCEDURE func2()
	FUKIDASI("5秒待ちます", 0, 50)
	SLEEP(5.000)
	FUKIDASI()
	flg[1] = TRUE
FEND
使用関数

ビットマップ画像を補色に変換(24ビット)

UWSC
PUBLIC item
PUBLIC count
PUBLIC starttime
PUBLIC bool = FALSE

CONST adTypeBinary = 1

DIM path = "D:\Desktop\UWSC\d22.bmp"
DIM array = getBitmap(path)
DIM width = array[1]
DIM height = array[2]

DIM Stream = CREATEOLEOBJ("ADODB.Stream")

WITH Stream
	.Open()
	.Type = adTypeBinary
	.LoadFromFile(path)
	DIM tmp = .Read(-1)
	.Close()
ENDWITH

THREAD progress()

starttime = text(now(), "yyyy/mm/dd hh:nn:ss")
count = width * height

FOR h = 0 TO height-1
	FOR w = 0 TO width
		item = w + width * h
		i = 54 + w * 3 + (h * (width+1) * 3)
		col = ""
		FOR rgb = 0 TO 2
			ii = i + rgb
			TRY
				hex = decToHex(tmp[ii])
			EXCEPT
				BREAK 2
			ENDTRY
			col = col + IIF(LENGTH(hex) = 1, "0", "") + hex
		NEXT
		color = hexToDec(col)
		comp = complementaryColor(color)
		comp = decToHex(comp)
		FOR rgb = 0 TO 2
			tmp[i + rgb] = hexToDec(COPY(comp, rgb * 2 + 1, 2))
		NEXT
	NEXT
	PRINT
NEXT
bool = TRUE

WITH Stream
	.Open()
	.Type = adTypeBinary
	.Write(tmp)
	DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
	DIM folderspec = FSO.GetParentFolderName(path)
	DIM filename = FSO.GetBaseName(path)
	DIM extension = FSO.GetExtensionName(path)
	path = folderspec + "\" + filename + "_comp." + extension
	.SaveToFile(uniqueFilename(path))
	.Close()
ENDWITH

PROCEDURE progress()
	REPEAT
		DIM elapsedTime = GETTIME() - GETTIME(0, starttime)
		DIM ratio = item / count
		time = elapsedTime / ratio
		FUKIDASI("開始時刻<#TAB>" + starttime + "<#CR>" + _
					"経過時間<#TAB>" + text(elapsedTime/86400, "hh:nn:ss") + "<#CR>" + _
					"進捗率<#TAB><#TAB>" + ROUND(ratio * 100, -5) + "%<#CR>" + _
					"項目数<#TAB><#TAB>" + item + "/" + count + "<#CR>" + _
					"残り時間<#TAB>" + IIF(INT((time-elapsedTime)/86400) <> 0, INT((time-elapsedTime)/86400) + "日", "") + text((time-elapsedTime)/86400, "hh:nn:ss") + "<#CR>" + _
					"終了予定時刻<#TAB>" + IIF(item = "" OR starttime = "", "∞", dateAdd("s", time, starttime)), 0, 0)
		SLEEP(0.001)
	UNTIL bool
FEND
使用関数
解説