*--需要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编辑过]