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