VB6・VBA関数メモ:Lockステートメント

Lockステートメントについてメモしておきます。

このステートメントはOpenステートメントで開いたファイルを他プロセルからのアクセスをロックする際に使用します。

ロックは読み書き両方に適用されるようです。
読み込みのみ、書き込みのみロックしたい場合はOpenステートメントを使う必要がありそうです。

また、Openステートメントでロックした場合と
ファイルロックによるエラーが発生するタイミングが異なる等、少し挙動が違うようなので注意です。
Openステートメントと違い、ファイルの一部をロックすることもできます。

なお、ロックを解除する場合はUnlockステートメントを使用します。
Lockステートメントでロックしたら必ずUnlockステートメントでロック解除するようにしましょう。
予期せぬエラーの原因となりかねません。


概要

Lock(#FileNumber, [RecordRange])
機能 Openステートメントで開いたファイルを他プロセルからのアクセスをロック
引数 FileNumber Openステートメントで指定したファイル番号
RecordRange (省略可)
Random/Binaryで開いたファイルのみ有効
 ・Random:ロック対象のレコード範囲
 ・Bynary:ロック対象のバイト範囲
「Lock #n X」のように指定すると位置Xをロック
「Lock #n X To Y」のように指定すると範囲X〜Yをロック
省略時はファイル全体をロック
戻り値 なし


使用例

説明 記述例 出力
Openステートメントで開いたファイルをロック
'アプリケーション1
Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Output As n

'ファイルをロック
Lock #n

'この間にアプリケーション2が処理

Unlock #n
Close #n

'アプリケーション2
On Error GoTo ERR_HANDLER

Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Output As n

'ロック中の為、エラー
Print #n, "123"
Close #n

ERR_HANDLER:
If Err > 0 Then Debug.Print Error

Close
書き込みできません。
ランダムアクセスモード(Random)の場合は、ロックするレコード範囲の指定可能
Public Type MyType
    num  As Integer
    str  As String * 3
    date As Date
End Type
'アプリケーション1
Dim rec As MyType
Dim n   As Integer
Dim i   As Long

n = FreeFile
Open "D:¥Sumple.txt" For Random As #n Len = Len(rec)

'3〜5レコードをロック
Lock #n, 3 To 5

'書き込み
For i = 1 To 5
    rec.num = i
    rec.str = Chr(Asc("A") + i - 1)
    rec.date = DateAdd("d", i - 1, date)
    
    Put #n, i, rec
Next i

'この間にアプリケーション2が処理

Unlock #n
Close #n

'アプリケーション2
On Error GoTo ERR_HANDLER

Dim rec As MyType
Dim n   As Integer
Dim i   As Long
Dim str As String

n = FreeFile
Open "D:¥Sumple.txt" For Random As #n Len = Len(rec)

'読み込み
For i = 1 To 5
    Get #n, i, rec		'3レコード目でエラー
    
    str = ""
    str = str & rec.num & ":"
    str = str & rec.str & ":"
    str = str & Format(rec.date, "MM/DD")
    Debug.Print str
Next i

ERR_HANDLER:
If Err > 0 Then Debug.Print Error

Close
1:A  :04/05
2:B  :04/06
書き込みできません。


動作検証

説明 記述例 出力
Lockを指定すると読み書き両方がロックされる
(エラーは読み込みでも「書き込みできません。」と出るようです)
'アプリケーション1
Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Input As n

'ファイルをロック
Lock #n

'この間にアプリケーション2が処理

Unlock #n
Close #n

'アプリケーション2
On Error GoTo ERR_HANDLER

Dim str As String
Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Input As n

'ロック中の為、エラー
Line Input #n, str

ERR_HANDLER:
If Err > 0 Then Debug.Print Error

Close #n
書き込みできません。
Lockを指定すると読み書き両方がロックされる
(エラーは何故かPrintではなくCloseで発生)
'アプリケーション1
Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Input As n

'ファイルをロック
Lock #n

'この間にアプリケーション2が処理

Unlock #n
Close #n

'アプリケーション2
On Error GoTo ERR_HANDLER

Dim n   As Integer

n = FreeFile
Open "D:¥Sumple.txt" For Output As n

'ロック中の為、エラー
Print #n, "abc"
Close #n

ERR_HANDLER:
If Err > 0 Then Debug.Print Error

Close #n
書き込みできません。


コメント
コメントする








    
この記事のトラックバックURL
トラックバック