TC官方合作论坛
标题:
线程开启返回线程ID是BUG?
[打印本页]
作者:
topses
时间:
2018-1-17 20:07
标题:
线程开启返回线程ID是BUG?
本帖最后由 topses 于 2018-1-18 12:49 编辑
主线程用 ThreadID=线程开启("subT1",""), 这个返回值特别奇怪: 特小
然后子线程用 ThreadID2 =
线程获取id() 相当 于
GetCurrentThreadId
但这两个返回的值不一样. 这是BUG吗?还是特别设计(我想可能这样, 可子线程怎么获取真正ID号呢?)
测试代码如下:
var ThreadID = 0
var ThreadID2 = 0
功能 执行线程_点击()
traceprint("主线程: 开始")
ThreadID = 0
ThreadID=线程开启("subT1","")
traceprint("主线程: 结束, 线程开启返回: " & ThreadID)
结束
功能 时间重设_点击()
var ret = 10000
ret = 线程恢复(ThreadID)
traceprint(ret)
// ret = 22222
// ret = 线程恢复(ThreadID2)
// traceprint(ret)
结束
function subT1()
ThreadID2 = 线程获取id()
traceprint("子线程: 等待开始" & "; 线程获取id: " & ThreadID2)
线程暂停(ThreadID)
// 线程暂停(ThreadID2)
traceprint("子线程: 等待结束")
end
复制代码
另外还特别查了一数据
一组
二组
10
16
10
16
方式
TC主线程
7744
1E40
8160
1FE0
线程获取id
ThreadID
7364
1CC4
8396
20CC
线程开启
ThreadID2
452
1C4
452
1C4
线程获取id
作者:
topses
时间:
2018-1-17 20:21
还有一点:子线程里不能开启回调函数.
这个大坑. 整整坑了我三个小时. 开始我一直以为我的代码有问题
作者:
topses
时间:
2018-1-18 08:26
自问自答了.
我学识太浅了.
我把句柄和ID混淆了.
var dwDesiredAccess = #3FF //THREAD_ALL_ACCESS
var bInheritHandle = false
var hThread = dllcall("kernel32.dll", "long", "OpenThread", "long", dwDesiredAccess, "long", bInheritHandle, "long", dwThreadId)
取得句柄. 然后你做你
想
的事
DuplicateHandle 也行, 参数多,麻烦, 虽可以暂停,但其它线程中不可唤醒了,WHY?权限问题?
作者:
topses
时间:
2018-1-18 08:53
奇怪, 昨天老出问题. 今天问题全没了, 连 DuplicateHandle 完美了.
最后只有二楼的疑问了:为什么子线程里不能开启回调函数.
这个大坑.
参考代码如下, 这里返回的句柄相当于TC线程ID, 所以直接可以用TC的函数操作了. 如线程暂停,线程恢复
function DuplicateHandle()
var hSourceProcess = dllcall("kernel32.dll", "long", "GetCurrentProcess")
var hSource = dllcall("kernel32.dll", "long", "GetCurrentThread")
var hTargetProcess = hSourceProcess
var phTarget = 0
var fdwAccess = 0
var bInheritHandle = false
var fdwOpti** = #2 //DUPLICATE_SAME_ACCESS = 0x00000002
var ret = dllcall("kernel32.dll", "long", "DuplicateHandle", "long", hSourceProcess, "long", hSource, "long", hTargetProcess, "plong", phTarget, "long", fdwAccess, "long", bInheritHandle, "long", fdwOpti**)
return phTarget
end
function OpenThread()
var dwDesiredAccess = #3FF //THREAD_ALL_ACCESS
var bInheritHandle = false
var dwThreadId = dllcall("kernel32.dll", "long", "GetCurrentThreadId")
// traceprint(获取错误信息(1))
// traceprint(dwThreadId)
var hThread = dllcall("kernel32.dll", "long", "OpenThread", "long", dwDesiredAccess, "long", bInheritHandle, "long", dwThreadId)
// traceprint(获取错误信息(1))
// traceprint(hThread)
return hThread
end
功能 资源释放_点击()
var hObject = ThreadID4
dllcall("kernel32.dll", "long", "CloseHandle", "long", hObject)
结束
复制代码
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1