首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在fsi中运行.fsx

如何在fsi中运行.fsx
EN

Stack Overflow用户
提问于 2017-05-14 20:04:14
回答 1查看 618关注 0票数 3

探索F#和FSharp.Charting,我想我应该从一个简单的‘你好世界’开始,但它留给我的问题比代码行更多。

代码语言:javascript
复制
#load @"..\packages\FSharp.Charting.0.90.14\FSharp.Charting.fsx"
open FSharp.Charting
let chart = Chart.Line([ for x in 0 .. 10 -> x, x*x ])
chart.ShowChart()
chart.SaveChartAs(@"C:\Temp\chart.png",ChartTypes.ChartImageFormat.Png)

这在VS中的交互式窗口中有效,但是我想要做的是从cmd行执行这个脚本(使用fsi.exe)。我将fsx文件关联到fsi,但当我执行它时,它会打开fsi,但没有创建图表。我该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-14 20:52:24

简短答案:在程序末尾添加以下行:

代码语言:javascript
复制
System.Windows.Forms.Application.Run()

较长的答覆:

该图表确实被创建,但它立即消失,因为您的程序立即退出,就在创建图表。这在Visual的F#交互式窗口中不会发生,因为F#交互窗口在执行程序后不会立即关闭-它只是挂在那里,等待您提交更多的代码以供执行。

为了使您的程序不立即退出,您可以实现一些等待机制,例如等待一定的时间(请参阅System.Threading.Thread.Sleep)或等待用户按回车(通过stdin.ReadLine())等。

但是,这实际上不会对您有所帮助,因为还有另一个问题:图表是通过Windows绘制的,该窗体依赖于运行消息循环 --否则窗口无法接收消息,因此无法自行绘制事件。

FSI 有自己的内置事件循环。,这就是您的程序在VS下的工作方式。但是,如果您实现了“等待”机制(例如stdin.ReadLine()),则此事件循环将被阻塞--将无法泵出消息。因此,在不干扰图表窗口功能的同时,阻止程序退出的唯一明智方法是启动您自己的事件循环。这正是Application.Run()所做的。

保存到磁盘而不显示:

(回应意见)

据我所知,FSharp.Charting库是一种在屏幕上显示图表的快速而肮脏的方式,主要用例是在F#互动中探索数据集。更具体地说,Chart对象的一些关键属性(如ChartAreasSeries )不会在创建图表时初始化,而是只在屏幕上显示它时才初始化(参见源代码),如果没有这些属性,图表将保持为空。

除了向库提交拉请求外,我建议将其放到底层的System.Windows.Forms.DataVisualization.Charting.Chart中。

代码语言:javascript
复制
open System.Windows.Forms.DataVisualization.Charting

let ch = new Chart()
ch.ChartAreas.Add( new ChartArea() )
let s = new Series( ChartType = SeriesChartType.Line )
s.Points.DataBind( [for x in 1..10 -> x, x*x], "Item1", "Item2", "" )
ch.Series.Add s;

ch.SaveImage(@"C:\Temp\chart.png", System.Drawing.Imaging.ImageFormat.Png)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43968308

复制
相关文章

相似问题

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