| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4260 人关注过本帖
标题:请教问题,请指教!
只看楼主 加入收藏
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
回复 20楼 吹水佬
谢谢!我试试。
2016-02-18 15:18
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
以下是引用sdta在2016-2-18 10:24:04的发言:


此言差也
T版说的不错
如果你认为T版说的不对,你可以为楼主解决这个问题



油,你用激将法套取代码,高。

为难我了,我是学生,恐怕不行,这是其一。
第二,如果我可以做了,你是要我证明T版是错的,间接批评T版,又可以得到代码,你这是一箭双雕呀。

这样吧,事情归事情,和T版没关系,晚上我试试看,至少用三种方法做,到时候请指教。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-18 18:24
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
向S版汇报进度:
目前已完成了两个,一个是使用 WinShell 事件,无计时器;
另一个是消息加计时器。

计划之中还在做:10个多线程的计时器,任务管理器,Windows 服务,可能要明天完成。
太难了,估计我不行。

呵呵。
图片附件: 游客没有浏览图片的权限,请 登录注册

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-18 21:40
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:3 
    如果楼主对于其它的方案感到无法下手,建议还是用VFP自带的计时器吧,上手容易。至于计时器有误差,我个人看法是:可以忽略。VFP的计时器间隔以毫秒为单位,间隔准不准受到两个方面的影响:1、CPU时钟周期(不是Windows通知区域的那个时钟)、振荡周期等硬件的影响;2、计时器设定的间隔期间需要处理的事务大小。

    第1点用户无法干预,因为你计算机买来后,硬件条件就摆在那里了,你不可能自己生产一个CPU装进去的。但这种影响不大(十几年看过一本书上写的,但忘记具体数值了),你可以看代码运行的状态对计时器的Interval属性进行微小的调整即可。
    第2点就要看你在间隔期间给该计时器的Timer控件做多少事了。按你的说法,1分钟就一定要刷新一下数据,那么Interval设置为60000(1分钟×60秒×1000毫秒),你要保证Timer事件中用最少的代码只做3件事:读取TXT、写入DBF、刷新表单显示,其它啰哩叭嗦的事都在Timer事件以外的地方完成。只有这样,计时器才能基本保证1分钟的周期读一次数据。否则,1分钟到了,你Timer事件里的代码都还没完成,那它就无法在上一次事务还没完成的情况下,再循环一次执行该事务。

    好了,以上是我使用VFP计时器的些许心得,希望能帮到楼主。
2016-02-18 22:28
pjtyzyq
Rank: 4
等 级:业余侠客
威 望:6
帖 子:232
专家分:240
注 册:2016-2-14
收藏
得分:0 
回复 24楼 taifu945
非常感谢所有的朋友,问题基本解决。
2016-02-19 07:40
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
示例 1:
使用 Windows 外壳 (Shell) 事件,无计时器
图片附件: 游客没有浏览图片的权限,请 登录注册


WindowsEvents.rar (16.1 KB)

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-19 10:05
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
示例 2:

图片附件: 游客没有浏览图片的权限,请 登录注册


* 监控某个目录下的文件或目录的改动、增删事件,消息+计时器

Public oForm
Clear
* oForm = Createobject("Tform", SYS(2023)) && 监控系统 Temp 目录
oForm = Createobject("Tform", "C:\Temp") && 监控 C:\Temp 目录
oForm.Visible = .T.
* 结束主程序

Define Class Tform As Form
    #Define FILE_NOTIFY_CHANGE_FILE_NAME 1
    #Define FILE_NOTIFY_CHANGE_DIR_NAME 2
    #Define FILE_NOTIFY_CHANGE_ATTRIBUTES 4
    #Define FILE_NOTIFY_CHANGE_SIZE 8
    #Define FILE_NOTIFY_CHANGE_LAST_WRITE 16
    #Define FILE_NOTIFY_CHANGE_LAST_ACCESS 32
    #Define FILE_NOTIFY_CHANGE_CREATION 64
    #Define FILE_NOTIFY_CHANGE_SECURITY 128
    #Define INVALID_HANDLE_VALUE -1
    #Define WAIT_OBJECT_0 0
    #Define WATCHING_INTERVAL 1000  && 间隔时间,单位:毫秒

    Protected hNotify, PathBeingWatched

    Width = 400
    Height = 150
    MaxButton = .F.
    BorderStyle = 2
    AutoCenter = .T.
    Caption = "正在监控目录"

    hNotify = INVALID_HANDLE_VALUE
    PathBeingWatched = ""

    Add Object lblTarget As Label With Left = 10, Top = 7, AutoSize = .T.
    Add Object tm As Timer With Interval = 0

    Add Object lblAlert As Label With Left = 10, Top = 30, ;
        Autosize = .T., Caption = "通知 : "

    Function Init(cPath)
        This.Declare
        This.PathBeingWatched = Fullpath(m.cPath)

        If Not This.StartWatching()
            = Messagebox("通知句柄错误,可能不存在该目录。")
            Return .F.
        Endif

    Procedure Destroy
        This.StopWatching
        Clear Dlls

    Protected Function StartWatching
        Local lResult

        * 监控的目录不存在
        This.hNotify = FindFirstChangeNotification(;
            THIS.PathBeingWatched, 0,;
            FILE_NOTIFY_CHANGE_FILE_NAME +;
            FILE_NOTIFY_CHANGE_LAST_WRITE )

        lResult = (This.hNotify <> INVALID_HANDLE_VALUE)

        If lResult
            This.lblTarget.Caption = "监控目录 : " +;
                THIS.PathBeingWatched
            This.tm.Interval = WATCHING_INTERVAL
        Endif
        Return  lResult

    Protected Procedure ContinueWatching
        If FindNextChangeNotification(This.hNotify) = 0
            This.StopWatching
            = Messagebox("响应错误.")
            This.Release
        Endif
        This.tm.Interval = WATCHING_INTERVAL

    Protected Function StopWatching
        This.tm.Interval = 0
        If This.hNotify <> INVALID_HANDLE_VALUE
            = FindCloseChangeNotification(This.hNotify)
        Endif

    Function _signaled        && 返回信号状态
        Return (WaitForSingleObject(This.hNotify, 0) = WAIT_OBJECT_0)

    Procedure _notify         && 触发通知事件
        Local cMessage
        cMessage = "通知 : " + Ttoc(Datetime()) + " 该目录的文件有增删或改动!"
        This.lblAlert.Caption = cMessage
        Activate Screen
        ? cMessage
        ? FILE_NOTIFY_CHANGE_FILE_NAME
        * 这里可以写获取数据的程序......
        This.ContinueWatching

    Procedure tm.Timer
        If Thisform._signaled()
            Thisform._notify
        Endif

    Protected Procedure Declare
        Declare SHORT FindNextChangeNotification In kernel32;
            INTEGER hChangeHandle

        Declare SHORT FindCloseChangeNotification In kernel32;
            INTEGER hChangeHandle

        Declare Integer FindFirstChangeNotification In kernel32;
            STRING lpPathName, Integer bWatchSubtree,;
            INTEGER dwNotifyFilter

        Declare Integer WaitForSingleObject In kernel32;
            INTEGER hHandle, Integer dwMilliseconds

Enddefine

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-19 10:56
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
示例 3:
使用开源的 vfp2c 库,网址在:https://vfpx.
vfp2c 包装了 100+个 API 函数库
其中 FindFileChange() 函数是文件更改的消息事件

代码:
Clear
Set Library To vfp2c32.fll Additive
#DEFINE VFP2C_INIT_ALL        0xFFFFFFFF
=InitVFP2C32(VFP2C_INIT_ALL)

*!*    FindFileChange Notification Events
#Define FILE_NOTIFY_CHANGE_FILE_NAME    0x00000001
#Define FILE_NOTIFY_CHANGE_DIR_NAME     0x00000002
#Define FILE_NOTIFY_CHANGE_ATTRIBUTES   0x00000004
#Define FILE_NOTIFY_CHANGE_SIZE         0x00000008
#Define FILE_NOTIFY_CHANGE_LAST_WRITE   0x00000010
#Define FILE_NOTIFY_CHANGE_SECURITY     0x00000100
cDirectory = "C:\Temp"  && 最大的路径名限制 260 个字符.
bWatchSubtree = .F.     && .T. = 监视根目录和子目录,.F. = 只监视指定的目录
nFilter = FILE_NOTIFY_CHANGE_SIZE  && 文件大小更改的消息
cCallback = "FolderChanged"  && 回调函数
=FindFileChange(cDirectory, bWatchSubtree, nFilter, cCallback)
Set Library To


Function FolderChanged
    Lparameters hHandle, cPath, nError
    If nError = 0
        ? cPath + ' 已更改'
    Else
        ? '函数 : ' + cPath + " 失败. 错误代码. ", nError
    Endif
Endfunc

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-19 16:31
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
示例 4:
使用 VFP Focus.Fll 库,该 FLL 网上有人发过
其中也有 10 多个消息事件的函数


Set Library To FOCUS.FLL
Clear

Local nHandle

If ( NOT_HandlesFree() > 0 )
    NOT_Frequency( 1000 )  && 间隔 1 秒内将报告该目录的任何变化。
    nHandle = NOT_Set( "C:\Temp", "WarnMe", .T., 24 )

    If ( nHandle != -1 )
        ? NOT_info( nHandle,1 )       && "C:\Temp"
        ? NOT_info( nHandle,2 )       && "WarnMe"
        ? NOT_info( nHandle,3 )       && .T.
        ? NOT_info( nHandle,4 )       && 24
    Else
        =Messagebox( "无法设置通知", 48, "通知" )
    Endif
Else
    =Messagebox( "无法设置通知,可能不存在 [C:\Temp] 目录。请释放某些句柄。", 48, "通知" )
Endif

Function WarnMe( nHandle )  && 发出警告
    =Messagebox( "有人在动我的 C 盘", 64, "通知" )
    Return
Endfunc

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-19 16:35
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
是不是进度太快了些,我们应该掌控好节奏,还有几个不同的方法在测试。
最后有个报告,分别说明使用消息、事件、计时器、计划管理等几种方法的适用范围及利弊。

我们既要有鱼,也要有渔,过程和结果都重要。

S 版你看这样子可以吗?

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-19 16:48
快速回复:请教问题,请指教!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032099 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved