Skip to content

线程安全 / 多线程支持

虽然目前还没有原生语言语法(计划中),但你可以直接调用 CreateThread 而无需任何变通方法。以前,VBx 和其他 BASIC 语言通常需要复杂的变通方法才能使用 CreateThread 来做一些非常简单的事情之外的事情。在 twinBASIC 中,你可以直接调用它以及所有其他线程 API,除了当然需要谨慎管理这种底层的线程操作外,无需任何特殊步骤。

示例

在新的标准 EXE 项目中,向窗体添加一个 CommandButton 和一个 TextBox:

vb
Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare PtrSafe Function CreateThread Lib "kernel32" ( _
                        ByRef lpThreadAttributes As Any, _
                        ByVal dwStackSize As Long, _
                        ByVal lpStartAddress As LongPtr, _
                        ByRef lpParameter As Any, _
                        ByVal dwCreationFlags As Long, _
                        ByRef lpThreadId As Long) As LongPtr

Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" ( _
                        ByVal hHandle As LongPtr, _
                        ByVal dwMilliseconds As Long) As Long

Private Const INFINITE = -1&

Private Sub Command1_Click() Handles Command1.Click
    Dim lTID As Long
    Dim lCurTID As Long
    Dim hThreadNew As LongPtr
    lCurTID = GetCurrentThreadId()
    hThreadNew = CreateThread(ByVal 0, 0, AddressOf TestThread, ByVal 0, 0, lTID)
    Text1.Text = "Thread " & lCurTID & " is waiting on thread " & lTID
    Dim hr As Long
    hr = WaitForSingleObject(hThreadNew, 30000&) 'Wait 30s as a default. You can use INFINITE instead if you never want to time out.
    Text1.Text = "Wait end code " & CStr(hr)
End Sub

Public Sub TestThread()
    MsgBox "Hello thread"
End Sub

在单线程代码下,如果你在更新 Text1.Text 之前调用 TestThread,文本在你点击消息框的确定按钮之前不会更新。但在这里,消息框在单独的线程中启动,所以执行继续并更新了文本,之后我们手动选择等待消息框线程退出。

twinBASIC及其LOGO版权为作者"韦恩"所有