TC官方合作论坛

 找回密码
 立即注册
查看: 1311|回复: 3

[已解决] 线程开启返回线程ID是BUG?

[复制链接]
发表于 2018-1-17 20:07:41 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 topses 于 2018-1-18 12:49 编辑

主线程用 ThreadID=线程开启("subT1",""), 这个返回值特别奇怪: 特小
然后子线程用 ThreadID2 = 线程获取id()  相当 于 GetCurrentThreadId
但这两个返回的值不一样. 这是BUG吗?还是特别设计(我想可能这样, 可子线程怎么获取真正ID号呢?)


测试代码如下:

  1. var ThreadID = 0
  2. var ThreadID2 = 0
  3. 功能 执行线程_点击()
  4.     traceprint("主线程: 开始")
  5.     ThreadID = 0
  6.     ThreadID=线程开启("subT1","")
  7.     traceprint("主线程: 结束, 线程开启返回: " & ThreadID)
  8. 结束

  9. 功能 时间重设_点击()
  10.     var ret = 10000
  11.     ret = 线程恢复(ThreadID)
  12.     traceprint(ret)
  13.    
  14. //    ret = 22222
  15. //    ret = 线程恢复(ThreadID2)
  16. //    traceprint(ret)
  17. 结束

  18. function subT1()
  19.     ThreadID2 = 线程获取id()
  20.     traceprint("子线程: 等待开始" & "; 线程获取id: " & ThreadID2)
  21.     线程暂停(ThreadID)
  22. //    线程暂停(ThreadID2)   
  23.     traceprint("子线程: 等待结束")
  24. end
复制代码



另外还特别查了一数据
一组二组
10161016方式
TC主线程77441E4081601FE0线程获取id
ThreadID73641CC4839620CC线程开启
ThreadID24521C44521C4线程获取id


回复

使用道具 举报

 楼主| 发表于 2018-1-17 20:21:50 | 显示全部楼层
还有一点:子线程里不能开启回调函数. 这个大坑. 整整坑了我三个小时. 开始我一直以为我的代码有问题


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-18 08:26:28 | 显示全部楼层

自问自答了.
我学识太浅了. 我把句柄和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?权限问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-18 08:53:32 | 显示全部楼层
奇怪, 昨天老出问题. 今天问题全没了, 连 DuplicateHandle 完美了.


最后只有二楼的疑问了:为什么子线程里不能开启回调函数. 这个大坑.


参考代码如下, 这里返回的句柄相当于TC线程ID, 所以直接可以用TC的函数操作了. 如线程暂停,线程恢复

  1. function DuplicateHandle()
  2.     var hSourceProcess = dllcall("kernel32.dll", "long", "GetCurrentProcess")
  3.     var hSource = dllcall("kernel32.dll", "long", "GetCurrentThread")
  4.     var hTargetProcess = hSourceProcess
  5.     var phTarget = 0
  6.     var fdwAccess = 0
  7.     var bInheritHandle = false
  8.     var fdwOpti** = #2                        //DUPLICATE_SAME_ACCESS = 0x00000002
  9.     var ret = dllcall("kernel32.dll", "long", "DuplicateHandle", "long", hSourceProcess, "long", hSource, "long", hTargetProcess, "plong", phTarget, "long", fdwAccess, "long", bInheritHandle, "long", fdwOpti**)
  10.     return phTarget
  11. end


  12. function OpenThread()
  13.     var dwDesiredAccess = #3FF                        //THREAD_ALL_ACCESS
  14.     var bInheritHandle =  false
  15.     var dwThreadId = dllcall("kernel32.dll", "long", "GetCurrentThreadId")
  16. //        traceprint(获取错误信息(1))
  17. //        traceprint(dwThreadId)   
  18.     var hThread = dllcall("kernel32.dll", "long", "OpenThread", "long", dwDesiredAccess, "long", bInheritHandle, "long", dwThreadId)
  19. //        traceprint(获取错误信息(1))
  20. //        traceprint(hThread)
  21.         return hThread
  22. end

  23. 功能 资源释放_点击()
  24.         var hObject = ThreadID4
  25.     dllcall("kernel32.dll", "long", "CloseHandle", "long", hObject)
  26. 结束
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-19 19:33 , Processed in 0.045120 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表