拡張プロパティが変更できないのは奇妙です...誰か助けてもらえますか?
open System.IO.Ports
open System.Text
open System.Text.RegularExpressions
type UAgent<'T> = MailboxProcessor<'T>
module ComPortManager =
type MailboxProcessor<'T> with
member this.sP = ref(new SerialPort("0"))
member this.receivedSeq : byte [] = Array.empty
member this.pastMsgSent : seq<string> = Seq.empty
type Cmd =
| Send = 0
| Remove = 1
| Add = 2
type UartOP =
| Open of unit
| Comm of Cmd * string
| Handler of Cmd * SerialDataReceivedEventHandler
let CreateComPort =
fun pN bR (p : System.IO.Ports.Parity) dB (sB : System.IO.Ports.StopBits) to' handler ->
match Array.exists (fun a -> a = pN) (SerialPort.GetPortNames()) with
| false -> failwith "Not valid comport!"
| _ -> ()
let mutable agent : UAgent<UartOP> =
UAgent.Start(handler)
let mutable sP = new SerialPort(pN)
agent.sP := sP
agent.sP.contents.Close()
match agent.sP.contents <> null with
| true ->
agent.sP.contents.Close()
| false ->
()
agent.sP.contents.BaudRate <- bR
printfn "\r\n=o==> %s" (bR.ToString())
printfn "\r\n=o==> %s" (sP.BaudRate.ToString())
printfn "\r\n=o==> %s" (agent.sP.contents.BaudRate.ToString())
agent.sP.contents.Parity <- p
agent.sP.contents.DataBits <- dB
agent.sP.contents.StopBits <- sB
agent.sP.contents.ReadTimeout <- to'
agent
変数sPのプロパティコンテンツのボーレートは、bRに設定しようとしても変化しません。
出力は次のようになります。
= o ==> 19200
= o ==> 9600
= o ==> 9600
これを行おうとしている方法は機能しません。F#では、拡張機能は既存の型に新しいフィールドを追加できないため、実際に変更可能な状態を追加することはできません。
あなたの定義がしていることは、常に新しい値(の場合は新しい参照セル、の場合はsP
新しい配列receivedSeq
)を返す一連の読み取り専用プロパティを追加することです。を呼び出すたびにagent.sP
、新しい値が作成されて返されます(したがって、すぐにガベージコレクションされる新しいコピーを変更することになります)。
これを解決するには、メールボックスプロセッサをラップし、次のような行に沿って追加の状態を追加する新しいタイプを作成する必要があります。
type MyMailbox<'T>() =
let mbox = MailboxProcessor.Start( ... )
member val sP = ref(new SerialPort("0")) with get, set
member val receivedSeq : byte [] = Array.empty with get
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加