正在寻找python或R解决方案.
在R中,我可以使用以下请求从第三方应用程序检索DDE数据到R中:
library(tcltk2)
tk2dde.request(service = 'prortdde',topic='MNQXXXX', item='last')
"12262.75"我想不断更新这些数据。如何创建记录所有更改的某种dde服务器或消息传递系统?
在循环中包含以上内容意味着当更新比循环执行更快时丢失数据.谢谢你的帮助。
在python中,这是我当前的工作代码:
import win32ui
import dde
s=dde.CreateServer()
s.Create("prortdde")
c=dde.CreateConversation(s)
c.ConnectTo("prortdde", "MNQXXXX")
c.Connected()
c.Request("last")
# "12262.75"但这也会错过同时更新的值(这种情况经常发生)。我需要的是某种类型的消息传递系统,它可以存储所有的值,即使是同时生成的值,这样以后我就可以检索它们。用DDE有可能吗?
发布于 2022-09-03 20:08:16
我对R语言一无所知。我刚刚把这个弗兰肯斯坦怪物放在这里,为你的问题创造了一个生产者-消费者范例。
该计划是运行一个非阻塞线程,它将继续轮询您要查找的值,并使用生产者非阻塞函数data_in_stock将其扩展到list prortdde_produce_continuously。然后等待您使用函数prortdde_consume_one轻松地使用这些值,该函数要么返回最新未使用的值(如果有的话),要么使用最新的old_value。
为了演示起见,我做了一个由十个迭代组成的循环,每5秒打印一次最新的未消耗值。(我对你的申请一点也不了解,我正在为时间的估计而画线)。
一旦您希望看到无限生产循环停止,只需将标志keep_consuming设置为FALSE即可。
此代码未进行测试。真对不起。
library(tcltk2)
library(future)
data_in_stock <- list()
old_value <- ""
keep_producing <- TRUE
last_consumed_value <- ""
prortdde_produce_continuously %<-% {
while (keep_producing) {
new_value <- tk2dde.request(service = 'prortdde', topic='MNQXXXX', item='last')
if (new_value != old_value) {
# The new value does not have to be pushed to `data_in_stock`
data_in_stock <- append(data_in_stock, new_value)
old_value <- new_value
}
# Wait for 0.1 seconds (I don't know how fast your data changes)
sys.sleep(0.1)
}
}
prortdde_consume_one <- function(){
if (length(data_in_stock) > 0) {
last_consumed_value = data_in_stock[1]
data_in_stock[[1]] <- NULL
return(last_consumed_value)
}
return(old_value)
}
# According to documentation, this line allows the non-blocking execution to happen
plan(multiprocess)
# Keeps polling and `producing` them indefinitely
prortdde_produce_continuously()
# Consumes 10 values
for (val in 1:10) {
print(prortdde_consume_one)
sys.sleep(5)
}
# Tells the `producing` to stop
keep_producing <- FALSEhttps://stackoverflow.com/questions/73521573
复制相似问题