首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用.Net (C#/F#)在控制台应用程序的新窗口中显示不断变化的(动画)图像,而不会阻塞控制台?

如何使用.Net (C#/F#)在控制台应用程序的新窗口中显示不断变化的(动画)图像,而不会阻塞控制台?
EN

Stack Overflow用户
提问于 2018-07-27 22:09:50
回答 1查看 49关注 0票数 0

我正在尝试在.Net中构建一个starcraft2 AI,我想显示一个包含一些实时特征地图数据的窗口。AI从控制台应用程序运行,我想让它保持这种方式。我想让我的代码输出一些位图数据来显示在窗口中,因为AI是实时完成它的事情的。但是,在this answer中,从控制台应用程序运行窗体似乎会阻塞控制台线程。

如何从控制台应用程序运行窗体,并定期向其传递位图?我是用F#做的,但我很高兴看到基于C#或VB.Net的答案,因为我可以根据需要进行翻译。

我不想尝试将它作为Windows应用程序运行来显示表单,然后让我的AI从那里运行,因为在某些时候,我可能想在梯子上与我的AI竞争,我不确定windows forms应用程序是否会被支持。

我想我可以让我的控制台应用程序通过零mq或其他方式发布数据,然后恰好侦听的任何进程都可以显示数据,但对于一个简单的需求来说,这似乎有点复杂。如果没有更好(更容易)的解决方案,我会认为这是答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 22:32:11

下面是一个使用F# MailboxProcessor并将窗体托管在单独线程上的工作示例。这使用了文本框而不是图像,但它的概念是相同的。

代码语言:javascript
运行
复制
module ConsoleApp 

open System
open System.Windows.Forms

type WinForm () as form =
    inherit Form ()
    let textBox = new TextBox()
    do form.Controls.Add(textBox)

    member __.SetText text = textBox.Text <- text

type Message = SetText of string
type UpdateText = delegate of unit -> unit

let form = new WinForm()    

let agent =
    MailboxProcessor.Start
    <| fun inbox ->
        let rec loop () =
            async {
                let! (SetText text) = inbox.Receive()
                form.Invoke(UpdateText(fun () -> form.SetText(text))) |> ignore
                return! loop ()
            }
        loop ()

[<EntryPoint>]
let main argv =
    async { form.ShowDialog() |> ignore } |> Async.Start
    let rec loop () =
        printf "Enter Text: "
        match Console.ReadLine() with
        | "exit" -> ()
        | text -> agent.Post <| SetText text; loop()
    loop ()
    0

请注意,使用ShowDialog显示表单非常重要,否则托管表单的线程将返回线程池,表单将变得无响应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51559754

复制
相关文章

相似问题

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