SyncLock
相互排他ロックを用いて複数のタスクを同期させます。
書式
SyncLock シグナル番号 [, タイムアウト]
パラメーター
- シグナル番号
- 受信する信号番号 (0~63の整数)を、式または数値で指定します。
- タイムアウト
- ロックまで待つ最長待機時間を、式または数値 (実数)で指定します。省略可能です。
解説
SyncLock は、共通のリソースを1度に1タスクだけが使うよう、同期ロックするために使います。あるタスクが共通リソースを使い終わったら、SyncUnlockを呼び出してロック解除し、他のタスクがそのリソースを使えるようにします。
1つのタスクがロック解除することができるのは、あらかじめ自分がロックしたsyncIDだけです。
タスクは、ロック解除するためにSyncUnlockを実行しなくてはいけません。 タスクが終了された場合は、そのタスクが行ったロックは解除されます。
同じシグナル番号に対して、2回連続でSyncLockを実行するとエラーになります。
タイムアウトパラメーターが指定された場合は、Tw関数を使って、ロックが成功したかどうかをチェックできるようにしてください。
注意
EPSON RC+ 5.0ではタスクが終了しても自動的にロックは解除されませんが、EPSON RC+ 6.0, RC+ 7.0, Epson RC+ 8.0では自動的に解除されます。
参照
Signal, SyncLock, TW関数, Wait, WaitPos
SyncLock使用例
下記例では、 SyncLockとSyncUnlockを使って、1度に1タスクだけが、ログファイルにメッセージを書き込めるように設定しています。
Function Main
Xqt Func1
Xqt Func2
Fend
Function Func1
Long count
Do
Wait .5
count = count + 1
LogMsg "Msg from Func1, " + Str$(count)
Loop
Fend
Function Func2
Long count
Do
Wait .5
count = count + 1
LogMsg "Msg from Func2, " + Str$(count)
Loop
Fend
Function LogMsg(msg$ As String)
SyncLock 1
OpenCom #1
Print #1, msg$
CloseCom #1
SyncUnlock 1
Fend
下記は、オプションのタイムアウトを使ったSyncLockの例です。Twを使ってロックが成功したかどうかをチェックしています。タイムアウトを使うことで、リソースをロックするのを待っている間、他のプログラムを実行することができます。
Function MySyncLock(syncID As Integer)
Do
SyncLock syncID, .5
If Tw = 0 Then
Exit Function
EndIf
If Sw(1) = On Then
Off 1
EndIf
Loop
Fend
← Sw関数 SyncUnlock →