public void ShowDisplay() { if (_sp == null) { throw new InvalidOperationException("COMPort not set."); } _task = Task.Factory.StartNew(() => { _sp.Open(); do { try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); return; } foreach (var item in Text) { try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); } DisplayUtil.send_16seg(DisplayUtil.PackInputText(item).ToArray(), UsePadding, _sp); Thread.Sleep(Delay); } } while (IsLoop); }, _tokenSource.Token).ContinueWith(t => { _tokenSource.Dispose(); _tokenSource = null; }); _sp.Close(); }
private void send_led(string text, bool replace = true) { //表示可能な文字列に整形する if (replace) { Regex re = new Regex(@"[^!%()*+-/<>A-Z0-9]"); text = (re.Replace(text.ToUpper(), " ")); } //フォームに反映 lbl_nowtext.Text = text; Refresh(); SerialOpen(); if (_tokenSource == null) { _tokenSource = new CancellationTokenSource(); } _task = Task.Factory.StartNew(() => { while (true) { Console.WriteLine("while loop"); // TaskのCancelを拾う // Cancelを拾うとOperationCanceledExceptionが発生する try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); return(true); } // パディングの作成 SegChar[] segPad = new SegChar[DISPLAY_DIGITS]; for (int i = 0; i < segPad.Length; i++) { segPad[i] = new SegChar(' '); } // 入力されたTextのPack var t = text.ToCharArray(); var segList = DisplayUtil.PackInputText(t); // DISPLAY_DIGITS 文字以下はそのまま出していく if (DISPLAY_DIGITS >= segList.ToArray().Length) { Console.WriteLine("send text: " + text); Invoke(new ProgressWriteDelegate(progress_write), text); DisplayUtil.send_16seg(segList.ToArray(), true, serialPort1); return(true); } // DISPLAY_DIGITS 文字以上の場合パディング+テキスト List <SegChar> buf = new List <SegChar>(); buf.AddRange(segPad); buf.AddRange(segList); for (int i = 0; i <= buf.ToArray().Length; i++) { bool isShowExist = false; // for文内でもTaskのCancelを拾う try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); return(true); } if (i + DISPLAY_DIGITS < buf.ToArray().Length) { // ConvertAllにてList<T>に入っているSegCharクラスのメンバ変数を取ってくる // List<string>で戻ってくるのでstring.join()で繋げる if (isShowExist == false) { string msg = DisplayUtil.ThreadLoop_Send16Seg(buf, i, DISPLAY_DIGITS, serialPort1); Invoke(new ProgressWriteDelegate(progress_write), msg); isShowExist = true; } else // TODO: 確認出来たらelse以下をカット { Console.WriteLine("Skip..."); } } else { string msg = DisplayUtil.ThreadLoop_Send16Seg(buf, i, buf.ToArray().Length - i, serialPort1); Invoke(new ProgressWriteDelegate(progress_write), msg); } Thread.Sleep(1000 - _scrollSpeed); } } }, _tokenSource.Token).ContinueWith(thread_releease); }