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();
 }
示例#2
0
        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);
        }