标题:在多线程上控制VFP窗体UI上的控件有一个问题我一对没有得到解决
只看楼主
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
结帖率:4.76%
已结贴  问题点数:20 回复次数:16 
在多线程上控制VFP窗体UI上的控件有一个问题我一对没有得到解决
搜索更多相关主题的帖子: 窗体 UI 控制 控件 VFP 
2023-03-30 11:13
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
得分:0 
情况如下:

c#有Invoke或者BeginInvoke,但VFP窗体我需要重建它的Invoke或者BeginInvoke这难度有点高,VFP太老了!
找不到任何有关窗体线程相关资料!看C的话又很难找到方向!待高手指导一下,因为我是直接在线程操作VFP表单UI控件,主要待解决鼠标按下不放影响,
我觉得鼠标按下不放,应该是SendMessage机制阻塞影的,而我的表单控件又在这个窗体线程大循环里面,实在无法拆分,我应该把窗体建一个像c#一样的委托代理线程在这个窗体线程消息循环之外的


[此贴子已经被作者于2023-3-30 11:29编辑过]

2023-03-30 11:20
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:7 
有点深奥啊。
2023-03-30 12:49
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
以前好像有贴探讨过类似的问题
测试过程是:VFP主窗口放一个控件显示时钟,子线程定时显示时钟。用鼠标左键按住右上角关闭(X)按钮拖动,看看时钟有无停止。
2023-03-30 13:19
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用吹水佬在2023-3-30 13:19:36的发言:

以前好像有贴探讨过类似的问题
测试过程是:VFP主窗口放一个控件显示时钟,子线程定时显示时钟。用鼠标左键按住右上角关闭(X)按钮拖动,看看时钟有无停止。

这个应该不是多线程问题,好像是定时器的问题。

2023-03-30 14:18
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用iswith在2023-3-30 11:20:49的发言:

情况如下:

c#有Invoke或者BeginInvoke,但VFP窗体我需要重建它的Invoke或者BeginInvoke这难度有点高,VFP太老了!
找不到任何有关窗体线程相关资料!看C的话又很难找到方向!待高手指导一下,因为我是直接在线程操作VFP表单UI控件,主要待解决鼠标按下不放影响,
我觉得鼠标按下不放,应该是SendMessage机制阻塞影的,而我的表单控件又在这个窗体线程大循环里面,实在无法拆分,我应该把窗体建一个像c#一样的委托代理线程在这个窗体线程消息循环之外的

可能是鼠标消息优先级较高,到了VFP主线程层面就不由子线程说了算。
SendMessage只是同步消息,就算改用PostMessage情况应该也差不多。

2023-03-30 14:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
这个应该不是什么问题,谁会闲得无事按住鼠标不放,除非发生了意外。
2023-03-30 15:02
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
得分:0 
是的没有人会按住鼠标不放,反正线程还在生命周期中,只是被当前窗体线程中某一个动作(SendMessage消息)循环给阻塞,你看C版Win32窗体构造函数就清楚了!我看C#有一个invoke我想学习它,然后VFP就可以这样this.invoke.VFP全部控件.方法属性XX,结果发现这很容易解决,但问题是这个还是在窗体线程循环中。。。我无语了!
2023-03-30 15:29
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用iswith在2023-3-30 15:29:32的发言:

是的没有人会按住鼠标不放,反正线程还在生命周期中,只是被当前窗体线程中某一个动作(SendMessage消息)循环给阻塞,你看C版Win32窗体构造函数就清楚了!我看C#有一个invoke我想学习它,然后VFP就可以这样this.invoke.VFP全部控件.方法属性XX,结果发现这很容易解决,但问题是这个还是在窗体线程循环中。。。我无语了!


windows都是用消息机制,COM编程用接口invoke方法调用COM对象。
只要与窗口打交道都脱不了与消息的关系,窗口过程和消息循环就说明了。
2023-03-30 16:45
iswith
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:154
专家分:101
注 册:2013-5-14
得分:0 
;********************************************************************
; 消息循环
;********************************************************************
        .while    TRUE
            invoke    GetMessage,addr @stMsg,NULL,0,0
            .break    .if eax    == 0
            invoke    TranslateMessage,addr @stMsg
            invoke    DispatchMessage,addr @stMsg
        .endw
        ret
调MFC ,重写窗体消息,不紧可以解决窗体多线问题还可以解决Unicode问题,需要功能深厚的大佬了。。。。

[此贴子已经被作者于2023-3-30 21:33编辑过]

2023-03-30 21:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511731-1-1.html




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

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