首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连续收听DDE数据

如何连续收听DDE数据
EN

Stack Overflow用户
提问于 2022-08-28 19:21:08
回答 1查看 152关注 0票数 3

正在寻找python或R解决方案.

在R中,我可以使用以下请求从第三方应用程序检索DDE数据到R中:

代码语言:javascript
复制
library(tcltk2)
tk2dde.request(service = 'prortdde',topic='MNQXXXX', item='last')
"12262.75"

我想不断更新这些数据。如何创建记录所有更改的某种dde服务器或消息传递系统?

在循环中包含以上内容意味着当更新比循环执行更快时丢失数据.谢谢你的帮助。

在python中,这是我当前的工作代码:

代码语言:javascript
复制
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有可能吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-03 20:08:16

我对R语言一无所知。我刚刚把这个弗兰肯斯坦怪物放在这里,为你的问题创造了一个生产者-消费者范例。

该计划是运行一个非阻塞线程,它将继续轮询您要查找的值,并使用生产者非阻塞函数data_in_stock将其扩展到list prortdde_produce_continuously。然后等待您使用函数prortdde_consume_one轻松地使用这些值,该函数要么返回最新未使用的值(如果有的话),要么使用最新的old_value

为了演示起见,我做了一个由十个迭代组成的循环,每5秒打印一次最新的未消耗值。(我对你的申请一点也不了解,我正在为时间的估计而画线)。

一旦您希望看到无限生产循环停止,只需将标志keep_consuming设置为FALSE即可。

此代码未进行测试。真对不起。

代码语言:javascript
复制
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 <- FALSE
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73521573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档