VisualFreeBasic代码_多线程

2026-1-21 / 0 评论 / 49 阅读

当开启一个软件后,系统分配给一个线程给软件执行,就是说,你的软件只是执行一个程序。然后有多线程,在同一时间,可以同时执行多个程序。

创建一个多线程

执行多线程,FB语言中,有2种创建方法。

  1. 指针方式,稳定高效,推荐使用
    多线程过程,和普通过程一样,但过程参数必须是1个,而且是指针。
    Threaddetach ThreadCreate(Cast(Any Ptr,@多线程过程),Cast(any ptr,参数)) 
    Sub 多线程过程(参数 As Any Ptr) 
    ......这里是代码.....过程结束,那么这个线程就结束
    End Sub
  2. 调用方式,支持多个参数,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 创建用于同步线程执行的互斥体
  3. 声明一个全局变量
    Dim Shared 多线程锁 As Any Ptr = MutexCreate()

    在不需要使用后,需要销毁,避免内存泄漏

    MutexDestroy 多线程锁
  4. 多线程中在需要读写全局内存
    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

控件属性,虽然大多数支持在多线程中设置,但是有小部分一些特殊的,不支持多线程操作。
为了绝对的安全,一般不建议在多线程中,设置控件属性。可以想象,有多个线程同时设置控件属性会发生什么事情?很难预料。

评论一下?

OωO
取消