マルチスレッド

マルチスレッドとは

ABでは、当然ですがマルチスレッドプログラムが組めます。
マルチスレッドというのは、プログラム内で並列処理を行うことです。
GUIなプログラムを作るとき、ボタンを押したときに無限ループをがあると、すぐにフリーズします。
こんなプログラムです。
Sub MainWnd_CommandButton1_Click()
While(1)
    Sleep(1)
Wend
End Sub
フリーズするのは、メッセージループに戻れないからです。
このとき、スレッドを作ってメッセージループと自分のプログラムのループを分けると、フリーズしないプログラムを作ることができます。
とりあえず何もしないサンプル(雛形)です。
#console
#include<vcrt71.sbp>

Dim hThre As HANDLE
Dim ID As *DWord
Dim code As DWord

'スレッド関数
Function Thre (lp As DWord) As DWord
    'スレッドの処理をここに書きます。
End Function

'スレッドを作る
hThre = CreateThread(ByVal NULL , 0 , AddressOf(Thre) , 0 , 0 , ID)

'スレッド終了まで待つ
GetExitCodeThread(hThre , code)
While code = STILL_ACTIVE
    Sleep(1)
    GetExitCodeThread(hThre , code)
Wend
スレッド関数は以下の形をとります。名前は任意です。
Function Thre (lp As DWord) As DWord
CreateThread関数はヘルプにあります。難しいことはありません。
GetExitCodeThread関数がすこし難しいかもしれません。終了コードが。
適当な言い方をすれば、スレッドの戻り値のようなものです。
ExitThread関数で好きな値を返すことができます。
ただ上の例のようにSTILL_ACTIVEかどうか判定する方法で十分でしょう。

すこしまともなアプリ

スレッド関数に実際に処理を書いて見ます。
ほとんど意味はありませんがデジタル時計です。
'スレッド関数
Function Thre (lp As DWord) As DWord
Dim timer As DWord
Dim t_st As *tm
Dim n As Long

For n = 0 To 10
    time(VarPtr(timer))
    t_st = localtime(VarPtr(timer))
    printf(Ex"%s",asctime(t_st))
    Sleep(1000)
Next
End Function
これはわざわざスレッド関数にする意味はありません。むしろ、スレッド化したことで悪くなっています。
今回はこのくらいにしておきます。ではまた。