vfp 与 com组件 的迷惑!
vfp 与 com组件 的困惑!!
用vfp9.0做的一个C/S系统,有一个模块需要采用FTP方式下载文件,文件大小在一般在(几百K ~ 4M)之间,由于vfp的单线程特征,所以整个下载过程,主界面是处于“瘫痪”状态的(不知道“瘫痪”一词是否恰当,姑且这么说吧,总之是停止一切响应。)
我的理想:
能不能在主界面发出下载需求后,交由一个后台运行的“组件”去完成下载工作,主界面该干嘛干嘛,后台“组件”下载完成后再通知主界面。
这对于自动更新程序也很有用:主进程发现新版本——> 通知后台“组件”下载 ——> 下载完成通知主进程。
我的尝试:
把FTP下载代码做成了一个“进程外组件”(exe),我以为“进程外组件”是独立于主进程运行的,相对于主进程应该算是另外一个进程了吧(这种多进程是不是变相实现了多线程呢),没想到:当主进程(主界面)调用这个专施下载之职的“进程外组件”后,整个下载过程,主界面仍然是“瘫痪”状态,非得下载完成后,主界面才“活”过来,而且下载过程中如果主界面有用户操作,比如移动一下主界面,首先这一操作无法响应,其次还会弹出一个讨厌的对话框:

请教各位大侠:这是怎么回事?有没有现在的,成熟的解决方案?
------解决方案--------------------
做成 com 应用(dll)
------解决方案--------------------
这样调用肯定有等待机制,建议把你的下载程序做成单独的EXE,然后开机后运行或者你的主程序调用运行:Run /N4 下载程序.exe,启动后隐藏。
然后需要下载时你的主程序发消息给下载程序
Declare Integer FindWindow In WIN32API String lpClassName,String lpWindowName
Declare Integer PostMessage In WIN32API Integer HWnd,Integer wMsg,Integer wParam,Integer Lparam
lnHWnd=FindWindow(Null,'下载程序的窗口Caption')
If lnHWnd>0
=Strtofile(ALLTRIM(thisform.text1.Value),'DFile.txt')
PostMessage(lnHWnd,1044,0,0)
Endif
下载程序建自定义方法,MyMessage
Lparameters tnHWnd,tnwMsg,tnwParam,tnLparam
If tnHWnd=This.HWnd And tnwMsg=1044
lcFile=Filetostr('DFile.txt')
*然后将 lcFile 给 cFtpPathName,开始下载,下载成功后,再通过 PostMessage 给主程序一个成功消息,方法相同不再介绍。
Endif
用vfp9.0做的一个C/S系统,有一个模块需要采用FTP方式下载文件,文件大小在一般在(几百K ~ 4M)之间,由于vfp的单线程特征,所以整个下载过程,主界面是处于“瘫痪”状态的(不知道“瘫痪”一词是否恰当,姑且这么说吧,总之是停止一切响应。)
我的理想:
能不能在主界面发出下载需求后,交由一个后台运行的“组件”去完成下载工作,主界面该干嘛干嘛,后台“组件”下载完成后再通知主界面。
这对于自动更新程序也很有用:主进程发现新版本——> 通知后台“组件”下载 ——> 下载完成通知主进程。
我的尝试:
把FTP下载代码做成了一个“进程外组件”(exe),我以为“进程外组件”是独立于主进程运行的,相对于主进程应该算是另外一个进程了吧(这种多进程是不是变相实现了多线程呢),没想到:当主进程(主界面)调用这个专施下载之职的“进程外组件”后,整个下载过程,主界面仍然是“瘫痪”状态,非得下载完成后,主界面才“活”过来,而且下载过程中如果主界面有用户操作,比如移动一下主界面,首先这一操作无法响应,其次还会弹出一个讨厌的对话框:
请教各位大侠:这是怎么回事?有没有现在的,成熟的解决方案?
------解决方案--------------------
做成 com 应用(dll)
------解决方案--------------------
这样调用肯定有等待机制,建议把你的下载程序做成单独的EXE,然后开机后运行或者你的主程序调用运行:Run /N4 下载程序.exe,启动后隐藏。
然后需要下载时你的主程序发消息给下载程序
Declare Integer FindWindow In WIN32API String lpClassName,String lpWindowName
Declare Integer PostMessage In WIN32API Integer HWnd,Integer wMsg,Integer wParam,Integer Lparam
lnHWnd=FindWindow(Null,'下载程序的窗口Caption')
If lnHWnd>0
=Strtofile(ALLTRIM(thisform.text1.Value),'DFile.txt')
PostMessage(lnHWnd,1044,0,0)
Endif
下载程序建自定义方法,MyMessage
Lparameters tnHWnd,tnwMsg,tnwParam,tnLparam
If tnHWnd=This.HWnd And tnwMsg=1044
lcFile=Filetostr('DFile.txt')
*然后将 lcFile 给 cFtpPathName,开始下载,下载成功后,再通过 PostMessage 给主程序一个成功消息,方法相同不再介绍。
Endif