TC官方合作论坛

 找回密码
 立即注册
查看: 2858|回复: 2

[已解决] TC多线程的一些总结!透过现象看本质!

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

马上加入TC

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

x
TC线程函数对应windows API
1,TC的sleep函数由sleep和MsgWaitForMultipleObjects构成。一个是阻塞消息一般用于子线程,一个不阻塞消息一般用于主线程UI。2,线程暂停》SuspendThread, 线程恢复》ResumeThread, 线程等待》WaitForSingleObject

概念
1, TC中线程函数操作的线程都是线程句柄,不是线程ID。TC的帮助文档有些混淆,有时用ID,有时用句柄,这是两个不同概念,还是建议统一用句柄handle。
如threadclose(id,type),而threadgetstatus(handle)

线程句柄是通过“线程打开”函数返回的,当然子线程自己的句柄也可通过下面函数获得
  1. dwThreadId=线程获取id()
  2. function OpenThread(dwDesiredAccess = #3ff, bInheritHandle = false, dwThreadId = 0)
  3.     //HANDLE WINAPI OpenThread(
  4.     //  _In_ DWORD dwDesiredAccess,                        //线程对象的访问权限; THREAD_ALL_ACCESS = #3FF
  5.     //  _In_ BOOL  bInheritHandle,                        //True: 这个进程将继承该句柄的进程。否则,进程不继承此句柄。
  6.     //  _In_ DWORD dwThreadId                                //要打开的线程标识符
  7.     //);
  8.     return dllcall("kernel32.dll", "long", "OpenThread", "long", dwDesiredAccess, "long", bInheritHandle, "long", dwThreadId)
  9. end
复制代码


多条子线程同步注意重点:

1,子线程中TC的sleep函数会引发系统让出控制权,给其他相同优先级的就绪状态的线程(当前代码暂停执行,去执行其他子线程代码)。
2,鼠标与键盘函数(包括超级键盘)同样会引发系统让出控制权,给其他线程(当前代码暂停执行,去执行其他子线程代码)。
3,临界区和线程等待应该是个不错结合。
4, 临界区的进入与离开之间不要发生跳转,如在中间插入了break和continue或其它流程控制语句,否则子线程很容易不可控,发生假死
5,事件没发现什么。。。待总结

sleep和鼠标、键盘函数这个用得多,多线程中会转换控制权这是重点,别被他们坑了。


以上就是我这TC新手的经验了, 不知道各种神仙针对多线程有其他什么经验总结的。







回复

使用道具 举报

发表于 2018-1-22 11:25:36 | 显示全部楼层
谢谢提供指导!
回复 支持 反对

使用道具 举报

发表于 2018-1-22 16:11:23 来自手机 | 显示全部楼层
认同。TC的线程句柄,线程ID,确实混。
线程开启 函数,建议TC统一改为线程句柄。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

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

GMT+8, 2024-5-19 05:52 , Processed in 0.042063 second(s), 23 queries .

Powered by 海安简单软件服务部

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

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