*--需要Netsuite.dll V1.003版支持
*--需要Mtcomvfp.dll 
*--演示如何暂停,结束一个线程
Clear 
_vfp.AutoYield = .F. &&消息列队( 在多线这样处理好一些,受窗体“X"影响 )
Local lcPath
If _vfp.StartMode = 0 Then 
   m.lcPath = Justpath( _vfp.ActiveProject.Name
  )
Else 
   m.lcPath = Justpath( sys(16,0) ) 
Endif
    
Set Default To ( m.lcPath )
*--载入H文件
#INCLUDE Netsuite.H
*--载入一个线程完成/异常类|回调过程类
Set Procedure To mt_events.prg
*--创建一个VFP多线程函数( 或写好一个PRG 函数库 直接调用 )
Local lcthrprgtest ;
    , lcthrfuncfile
m.lcthrprgtest
  = Addbs( Getenv("TEMP") ) + Sys(2015) + '.prg'
    
m.lcthrfuncfile
    = Forceext( m.lcthrprgtest , 'fxp' ) &&线程执行的VFP过程函数*--创建线程函数
Text To m.lcthrFunction Textmerge noShow
    Function test ( cthrId ) && 线程ID号
             Do Win_Api
            *以下参数变量所有载入线程函数中可以访问:
*!*
             cCmd
                  As String ;&&执行的装载函数命令 入参
*!*
             , oThreadedAdapter
    As Object ;&&线程适配器对象
        入参
*!*
             , oMainThread
            As Object ;&&主线程对象
            入参
*!*
          , oThread
              As Object ;&&当前线程对象
        入参
*!*
             , oThreadVFP
          As Object ;&&入参-没有值 经过MTComVFP附值线程VFP对象
*!*
             , cRetuErrMsg
            As String
  &&出参-没有值 经过MTComVFP线程函数执行结果返回值
     
             i = 1
             Do While ( .T.)
                 If oThreadedAdapter.isStop &&结束线程
                   Exit 
                Endif 
                *通过winAPI 给予线程交出CPU使用权,一般设计不会将CPU的使用全部由一个线程独占
*!*
                    Sleep(500) &&大致意思为 500ms执行一次 
                *--该处写线程处理一些事物
                *....
                 i = i + 1 
             Enddo
             *--一定要有返回值
             Return Transform(i) + "OK"
    Endfunc 
    
Endtext 
strtofile( lcthrFunction , m.lcthrprgtest )
Compile ( m.lcthrprgtest )
Erase
  ( m.lcthrprgtest )
*--实例化一个线程适配器对象[oThreadedAdapter]
Public oThreadedAdapter
m.oThreadedAdapter = Createobject("Netsuite.MultiThreadedAdapter")
*--绑定一个线程对象完成/异常事件(意思如果线程完成通知当前VFP主线程)
Local loComEvent 
m.loComEvent = CREATEOBJECT("COMAdapterEvents")
If !EVENTHANDLER( m.oThreadedAdapter , m.loComEvent ) Then 
    Messagebox('绑定一个线程事件类失败!',16, '绑定')
    Return .F.
Endif 
Public othread
*--实例化一个线程对象[othread] MTA模式
othread
                 = m.oThreadedAdapter.ThreadedAdapter( STA )
    
othread.IsBackground = .T.
                                      &&后台线程
        
othread.Priority
     = Normal
                                &&优先级
                                          
othread.name
         = 'test '
                                 &&可以给这个线程命名一个名称
                                
With m.oThreadedAdapter
    .ProgId
   = [mtcomvfp.MultiThread]
                         &&这个是用来关联VFP写的COM DLL类名
     *--将代码载入,且执行这个PRG的其中一个方法:
        *注意1.载入的PRG需要COMPILE为FXP(或执行一次系统默认编译)
        *注意2.prg被线程引用后注意修改,编译FXP,一般为等线程结束
        *注意3.prg的方法函数在执行需要返回前一定要加return
        *注意4."test_mtcomvfp_function.fxp"装载时需要注意路径位置
        *注意5.第一次的MTA多线程与后面的执行多线有所不同
   
        
     Text To m.lcCmd Textmerge Noshow Pretext 1+2+4
          set Procedure To <<m.lcthrfuncfile>> Additive
  
          Return test ("<<'线程'+Transform( othread.ManagedThreadId )>>" )
     Endtext
     
    .Cmd = m.lcCmd
                                              &&放在C#多线适配器驱动成多线程
Endwith 
?'线程'+ Transform( othread.ManagedThreadId )
  + [执行:函数(] + othread.Name +') , 启动...'
othread.Start()
*-在需要的暂停,退出线程地方使用:
*!*
    oThreadedAdapter.isStop = .T. &&结束线程
othread.Suspend
         &&挂起线程
othread.Resume
          &&恢复挂起线程
othread.Abort(.T.)
        &&结束线程(与oThreadedAdapter.isStop不一样设计逻辑)
[此贴子已经被作者于2023-8-16 18:57编辑过]