当开启一个软件后,系统分配给一个线程给软件执行,就是说,你的软件只是执行一个程序。然后有多线程,在同一时间,可以同时执行多个程序。
创建一个多线程
执行多线程,FB语言中,有2种创建方法。
- 指针方式,稳定高效,推荐使用
多线程过程,和普通过程一样,但过程参数必须是1个,而且是指针。Threaddetach ThreadCreate(Cast(Any Ptr,@多线程过程),Cast(any ptr,参数)) Sub 多线程过程(参数 As Any Ptr) ......这里是代码.....过程结束,那么这个线程就结束 End Sub - 调用方式,支持多个参数,0个或n个参数。
Threaddetach Threadcall 多线程过程(11,22,33) Sub 多线程过程(参数1 As Long,参数2 As Long ,参数3 As Long ) '......这里是代码.....过程结束,那么这个线程就结束 End Sub注意: 调用多线程的参数,必须传值给它,要是传变量给它,因为调用方的函数结束,变量会被释放,造成多线程使用这个变量发生错误,甚至软件崩溃。因为它们是同时执行的。
等待多线程完成
创建多线程后,返回一个多线程句柄
Dim aa As Any Ptr =ThreadCreate(Cast(Any Ptr,@多线程过程),参数) Dim aa As Any Ptr =Threadcall 多线程过程(参数)假如你不需要控制多线程,可以直接释放句柄,不释放就会产生内存泄漏。
Threaddetach aa等待线程完成执行并释放线程句柄(会一直等待多线程完成才会返回,这和单线程有何区别?不是我们想要的方式)
ThreadWait aa循环判断多线程是否完成
While IsThreadAlive( *aa) DoEventsEX(100) Wend Threaddetach aa多线程使用全局变量
假如有多个线程,同时对全局变量赋值或读取,将会造成不同步现象,特别是字符串,可能会造成软件崩溃。下面语句是专门为了解决这个问题的。
MutexLock 获取互斥体 MutexUnlock 释放互斥锁 MutexDestroy 销毁互斥 MutexCreate 创建用于同步线程执行的互斥体 - 声明一个全局变量
Dim Shared 多线程锁 As Any Ptr = MutexCreate()在不需要使用后,需要销毁,避免内存泄漏
MutexDestroy 多线程锁 - 多线程中在需要读写全局内存
MutexLock 多线程锁 ...... 一些读写全局内存 ......... MutexUnlock 多线程锁注意: “多线程锁”同一时间只能一个线程执行,其它的线程挂起,暂停执行。
过于频繁使用“多线程锁”,严重影响多线程执行效率,还不如单线程效率高。因此在设计多线程的程序框架时,必须考虑效率问题。
多线程中窗口问题
当在多线程中,启动了一个窗口,当多线程过程结束,窗口会被强制关闭,因此在多线程中,请勿启动窗口,会发生很多问题。
Form2.Show 多线程中请勿执行启动窗口
一定要启动窗口,可以对主窗口发自定义消息,实现在主线程中启动窗口。
PostMessage( form1.hWnd ,WM_USER+ &H1001 , 0 , 0 )
然后在主窗口的自定义消息事件中
Function Form1_Custom(hWndForm As hWnd, wMsg As UInteger, wParam As wParam, lParam As lParam) As LResult
Select Case wMsg
Case WM_USER+ &H1001
Form2.Show
End Select
Function = FALSE ' 若不想系统继续处理此消息,则应返回 TRUE (俗称吃掉消息)。
End Function
控件属性,虽然大多数支持在多线程中设置,但是有小部分一些特殊的,不支持多线程操作。
为了绝对的安全,一般不建议在多线程中,设置控件属性。可以想象,有多个线程同时设置控件属性会发生什么事情?很难预料。
评论一下?