snapshot before regression test
This commit is contained in:
104
includes/vthreading.py
Normal file
104
includes/vthreading.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import t, c
|
||||
from stdint import *
|
||||
from w32.win32base import *
|
||||
from w32.win32process import CreateThread, GetExitCodeThread, GetCurrentThreadId, TlsAlloc, TlsFree, TlsGetValue, TlsSetValue
|
||||
from w32.win32sync import WaitForSingleObject
|
||||
|
||||
# 全部导入锁类,用户也可按需导入
|
||||
from lock import Lock
|
||||
from event import Event
|
||||
from condition import Condition
|
||||
from rwlock import RWLock
|
||||
|
||||
|
||||
@t.Object
|
||||
class Thread:
|
||||
"""线程类,封装 Windows CreateThread。
|
||||
|
||||
线程回调签名: def thread_func(arg: t.CPtr) -> t.CPtr
|
||||
注意: Windows API 限制返回值为 DWORD(32位),64位指针会被截断。
|
||||
如需返回 64 位结果,请通过 arg 参数结构体传递。
|
||||
|
||||
用法:
|
||||
def worker(arg: t.CPtr) -> t.CPtr:
|
||||
# 线程逻辑
|
||||
return NULL
|
||||
|
||||
t: Thread = Thread(worker, arg_ptr)
|
||||
t.start()
|
||||
t.join()
|
||||
"""
|
||||
handle: HANDLE
|
||||
thread_id: ULONG
|
||||
target: VOIDPTR
|
||||
arg: VOIDPTR
|
||||
started: BOOL
|
||||
|
||||
def __init__(self, target: VOIDPTR, arg: VOIDPTR = NULL):
|
||||
self.handle = NULL
|
||||
self.thread_id = 0
|
||||
self.target = target
|
||||
self.arg = arg
|
||||
self.started = FALSE
|
||||
|
||||
def start(self):
|
||||
if self.started:
|
||||
return
|
||||
self.handle = CreateThread(NULL, 0, self.target, self.arg, 0, c.Addr(self.thread_id))
|
||||
self.started = TRUE
|
||||
|
||||
def join(self, timeout_ms: ULONG = INFINITE) -> BOOL:
|
||||
if not self.started:
|
||||
return FALSE
|
||||
result: ULONG = WaitForSingleObject(self.handle, timeout_ms)
|
||||
return result == WAIT_OBJECT_0
|
||||
|
||||
def is_alive(self) -> BOOL:
|
||||
if not self.started:
|
||||
return FALSE
|
||||
result: ULONG = WaitForSingleObject(self.handle, 0)
|
||||
return result == WAIT_TIMEOUT
|
||||
|
||||
def get_exit_code(self) -> ULONG:
|
||||
code: ULONG = 0
|
||||
GetExitCodeThread(self.handle, c.Addr(code))
|
||||
return code
|
||||
|
||||
def close(self):
|
||||
if self.handle != NULL:
|
||||
CloseHandle(self.handle)
|
||||
self.handle = NULL
|
||||
|
||||
|
||||
@t.Object
|
||||
class local:
|
||||
"""TLS (Thread Local Storage) 封装。
|
||||
|
||||
用法:
|
||||
tls: local = local()
|
||||
tls.set(value_ptr)
|
||||
val: t.CPtr = tls.get()
|
||||
"""
|
||||
index: ULONG
|
||||
|
||||
def __init__(self):
|
||||
self.index = TlsAlloc()
|
||||
|
||||
def get(self) -> VOIDPTR:
|
||||
return TlsGetValue(self.index)
|
||||
|
||||
def set(self, value: VOIDPTR) -> BOOL:
|
||||
return TlsSetValue(self.index, value)
|
||||
|
||||
def free(self) -> BOOL:
|
||||
return TlsFree(self.index)
|
||||
|
||||
|
||||
def get_current_thread_id() -> ULONG:
|
||||
"""获取当前线程 ID"""
|
||||
return GetCurrentThreadId()
|
||||
|
||||
|
||||
def sleep_ms(ms: ULONG):
|
||||
"""让当前线程休眠指定毫秒数"""
|
||||
Sleep(ms)
|
||||
Reference in New Issue
Block a user