注册 登录
编程论坛 VFP论坛

我用com口读称重数据,同时操作右键菜单,就读不到数据,是不是单线程问题?

ljb8864 发布于 2023-07-02 15:47, 1316 次点击
那应该如何用多线程

[此贴子已经被作者于2023-7-2 15:48编辑过]

19 回复
#2
shizi02023-07-02 16:18
虽然没看到程序很难说,但感觉不是线程问题。Vfp程序应该会等待COM返回,返回前右键操作不了。
#3
ljb88642023-07-02 16:41
回复 2楼 shizi0
com 口在运行,,右键菜单后停止
#4
吹水佬2023-07-02 17:43
VFP多线程有点麻烦
要实时监控可用一个子进程处理COM口数据,有数据时通过消息通知主进程处理数据。
#5
ljb88642023-07-02 17:53
回复 4楼 吹水佬
两不同执行文件窗体,用postmessage吗,,
消息发过来会执行吗
用web读com可行不

[此贴子已经被作者于2023-7-2 18:01编辑过]

#6
吹水佬2023-07-02 20:00
以下是引用ljb8864在2023-7-2 17:53:58的发言:

两不同执行文件窗体,用postmessage吗,,
消息发过来会执行吗
用web读com可行不

这种情况无需用WEB了吧
用VFP已经实现COM口数据处理了,只是想操作手顺点。
如果要求处理完一个事务才能处理下一个事务,就不能用异步消息(postmessage),要用SendMessage。
#7
ljb88642023-07-03 07:39
只有本站会员才能查看附件,请 登录

就是右键后COM读数停止了,而WEB的视频头在运行,说明WEB是多线程的,
#8
ljb88642023-07-03 09:44
预览报表或右键菜单都会停止COM读取,
#9
csyx2023-07-03 10:58
似乎很正常,右键菜单和报表的行为都像阻塞函数,在未取得用户选择前不会执行它们的vfp代码
report form 倒是有 nowait 子句可改变为非模式状态
#10
吹水佬2023-07-03 10:59
以下是引用ljb8864在2023-7-3 09:44:50的发言:

预览报表或右键菜单都会停止COM读取,

单线程的就是这样的吧,做完一事还一事,不可能有并行并发的事务。
#11
ljb88642023-07-03 12:12
回复 10楼 吹水佬
如果将COM另做一个执行文件运行,再使用SendMessage 发送回,此时右键菜单或预览报表状态下,会执行SendMessage传来的命令吗?

这函数能发送汉字吗?
SendMessage(lnCallMeHWnd,WM_COPYDATA, 0,@m.lcText)

string sendString = 测试发送数据;
byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)0 ;
cds.cbData = len + 1;
cds.lpData = sendString;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);


接收方:
if (m.Msg == WMA_InterPro)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string receiveInfo=cds.lpData;
}




[此贴子已经被作者于2023-7-3 12:26编辑过]

#12
吹水佬2023-07-03 12:44
以下是引用ljb8864在2023-7-3 12:12:59的发言:

如果将COM另做一个执行文件运行,再使用SendMessage 发送回,此时右键菜单或预览报表状态下,会执行SendMessage传来的命令吗?

这函数能发送汉字吗?
SendMessage(lnCallMeHWnd,WM_COPYDATA, 0,@m.lcText)

string sendString = 测试发送数据;
byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)0 ;
cds.cbData = len + 1;
cds.lpData = sendString;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);


接收方:
if (m.Msg == WMA_InterPro)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string receiveInfo=cds.lpData;
}

不是用VFP实现了的吗,直接给VFP代码
#13
ljb88642023-07-03 13:48
回复 12楼 吹水佬
还没有呢。SendMessage 怎么在VFP中实现

[此贴子已经被作者于2023-7-3 15:46编辑过]

#14
吹水佬2023-07-03 17:19
以下是引用ljb8864在2023-7-3 13:48:28的发言:

还没有呢。

7楼的不是吗
#15
ljb88642023-07-04 08:27
回复 14楼 吹水佬
SendMessage也起不了作用
#16
吹水佬2023-07-04 11:10
以下是引用ljb8864在2023-7-4 08:27:44的发言:

SendMessage也起不了作用

具体情况不明,起不起作用要分析和测试,代码说了才算。
#17
iswith2023-07-04 16:15
应该是可以的。。。
只有本站会员才能查看附件,请 登录
#18
ljb88642023-07-05 07:36
回复 17楼 iswith
大神!有实例代码吗?
#19
iswith2023-07-06 12:10
最新版的MYFLL好像有线程控制,你试试。。。。
#20
ljb88642023-07-11 13:10
回复 19楼 iswith
https://bbs.bccn.net/thread-511089-1-9.html


ShellExecWait        调用一个程序,并等待执行结束
SuspendThread        暂停一个线程
ResumeThread         恢复一个线程

[此贴子已经被作者于2023-7-11 13:11编辑过]

1