TC官方合作论坛

标题: TC多线程的一些总结!透过现象看本质! [打印本页]

作者: topses    时间: 2018-1-21 20:21
标题: TC多线程的一些总结!透过现象看本质!
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新手的经验了, 不知道各种神仙针对多线程有其他什么经验总结的。








作者: hao1210119    时间: 2018-1-22 11:25
谢谢提供指导!
作者: 剑仙十号    时间: 2018-1-22 16:11
认同。TC的线程句柄,线程ID,确实混。
线程开启 函数,建议TC统一改为线程句柄。




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1