将 .py 和 .pyi 后缀名改为了 .vp 和 .vpi 后缀名
This commit is contained in:
102
includes/vthreading.vp
Normal file
102
includes/vthreading.vp
Normal file
@@ -0,0 +1,102 @@
|
||||
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
|
||||
|
||||
# All lock classes are imported, and users can also import them as needed.
|
||||
from lock import Lock
|
||||
from event import Event
|
||||
from condition import Condition
|
||||
from rwlock import RWLock
|
||||
|
||||
|
||||
class Thread:
|
||||
"""Thread class, wraps Windows CreateThread.
|
||||
|
||||
Thread callback signature: def thread_func(arg: t.CPtr) -> t.CPtr
|
||||
Note: Windows API limits the return value to DWORD (32-bit), so 64-bit pointers will be truncated.
|
||||
If you need to return a 64-bit result, pass it via the arg parameter struct.
|
||||
|
||||
Usage:
|
||||
def worker(arg: t.CPtr) -> t.CPtr:
|
||||
# thread logic
|
||||
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
|
||||
|
||||
|
||||
class local:
|
||||
"""TLS (Thread Local Storage) encapsulation.
|
||||
|
||||
Usage:
|
||||
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:
|
||||
"""Get current thread ID"""
|
||||
return GetCurrentThreadId()
|
||||
|
||||
|
||||
def sleep_ms(ms: ULONG):
|
||||
"""Make the current thread sleep for a specified number of milliseconds"""
|
||||
Sleep(ms)
|
||||
Reference in New Issue
Block a user