【问题标题】:how to merge C# code of two similar but separate programs?如何合并两个相似但独立的程序的 C# 代码?
【发布时间】:2011-09-06 03:30:19
【问题描述】:

好的,所以我有两个程序。代码在最后。

一个是 gmail 通知器,它通过串行输出未读邮件的数量,例如:<02,> 等。

然后我有一个程序可以获取系统(pc)临时并将它们输出到串行也像:<30,42,50,>

它们都以不同的时间间隔(每次使用不同的值)输出相同的数据和相同的格式(<XX,>)。所以邮件一每5分钟检查一次邮件,然后输出到序列邮件的数量。但是临时程序以 1 秒的速度以更快的速度通过串行输出数据。

我一直在尝试将这两个程序合二为一,使其输出如下:<02,30,42,50,> 并每秒发送一次,以便临时更新。所以最后三组数字每秒改变一次,但第一组不会每 5 分钟改变一次,但 02 仍然包含在输出中,因为它(输出)每次都需要相同的长度/组织等。

那你们怎么看?最好的方法是什么?

我尝试将除static void Main 之外的所有 GMAIL 代码(所有 Main 在 gmail 程序中所做的就是调用 get mail 并将数据写入串行)到 TEMPS 程序,然后调用 getmail Unreadz = CheckMail(); 其中临时程序正在写入串行(在新的组合代码中),但这会停止向串行写入数据,以便它可以检查邮件,这有点慢,所以它不会写入整个<02,30,42,50,>,直到邮件完成检查。我的尝试:

reader.ReadToFollowing("value");
port.Write(reader.ReadElementContentAsString() + ",");
Unreadz = CheckMail();
if (Convert.ToInt32(Unreadz) < 10) port.Write("0" + Unreadz + ",");
else port.Write("" + Unreadz + ",");

谢谢。

GMAIL:

namespace GmailNotifier
{
    class Gmail
    {
        public static void Main(string[] args)
        {
            try 
            {
               SerialPort port = new SerialPort( "COM2", 9600, Parity.None, 8, StopBits.One );
               port.Open();

                string Unreadz = "0";
                while ( true )
                {
                    Unreadz = CheckMail();

                    port.Write("<");

                    Console.WriteLine("Unread Mails: " + Unreadz);
                    if (Convert.ToInt32(Unreadz) < 10) port.Write("0" + Unreadz + ",");
                    else port.Write("" + Unreadz + ",");

                    port.Write(">");

                    System.Threading.Thread.Sleep(1000);
                }
            } catch ( Exception ee ) { Console.WriteLine( ee.Message ); }

        }

        public static string TextToBase64( string sAscii ) 
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] bytes = encoding.GetBytes( sAscii );
            return System.Convert.ToBase64String( bytes, 0, bytes.Length );
        }

        public static string CheckMail() 
        {
            string result = "0";

            try 
            {
                var url = @"hsttps://gmail.google.com/gmail/feed/atom";
                var USER = <uname>;
                var PASS = <password>;

                var encoded = TextToBase64( USER + ":" + PASS );

                var myWebRequest = HttpWebRequest.Create( url );
                myWebRequest.Method = "POST";
                myWebRequest.ContentLength = 0;
                myWebRequest.Headers.Add( "Authorization", "Basic " + encoded );

                var response = myWebRequest.GetResponse();
                var stream = response.GetResponseStream();

                XmlReader reader = XmlReader.Create( stream );
                while ( reader.Read())
                    if ( reader.NodeType == XmlNodeType.Element )
                        if ( reader.Name == "fullcount" ) 
                        {
                            result = reader.ReadElementContentAsString();
                            return result;
                        }
            } catch ( Exception ee ) { Console.WriteLine( ee.Message ); }
              return result;
        }

    }
}

温度:

namespace AIDA64_Reader_SerailOut
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Reading AIDA64 Shared Memory and Sending to Serial");

            try
            {
                SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
                port.Open();

                while (true)
                    using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
                    {
                        using (var readerz = file.CreateViewAccessor(0, 0))
                        {
                            var bytes = new byte[195];
                            var encoding = Encoding.ASCII;
                            readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);

                            //File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));

                            StringReader stringz = new StringReader(encoding.GetString(bytes));

                            port.Write("<");

                            var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
                            using (var reader = XmlReader.Create(stringz, readerSettings))
                            {
                                while (reader.Read())
                                {
                                    using (var fragmentReader = reader.ReadSubtree())
                                    {
                                        if (fragmentReader.Read())
                                        {
                                            reader.ReadToFollowing("value");
                                            //port.Write("<");
                                            port.Write(reader.ReadElementContentAsString() + ",");
                                            //port.Write(">");

                                        }
                                    }
                                }
                            }
                            port.Write(">");
                        }
                        System.Threading.Thread.Sleep(1000);
                    }
            }
            catch (Exception ee) { Console.WriteLine(ee.Message); }

            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 您现在可能想更改您的 gmail 帐户的密码 - 因为即使您将其编辑掉,这也会出现在 SO 的历史记录中。如果不是您真正的 gmail 用户名/密码,请忽略此 PSA。 :)
  • 无论如何,它都应该被隐藏起来。任何方式都编辑了帖子。
  • 它不是我真正的,所以一切都很好。

标签: c# serial-port


【解决方案1】:

首先,您需要在后台线程上运行邮件检查器。试试BackgroundWorker 组件的大小。

其次,使用Timer 来触发您的温度更新,而不是让线程休眠。

要结合这两个程序,我首先要更改现有的类,以便在发生重要事情时引发事件。例如,temp 将每 1 秒引发一个事件,并且事件 args 将包含数据。

另一方面,邮件检查器只会在完成邮件检查后引发事件;也许只有当未读消息的数量与上次检查相比发生了变化时。

最后,创建一个新类,该类订阅每个现有程序的事件,并在触发事件时写入串行端口。此类可以将上次报告的未读消息计数存储在私有字段中,并在每次触发新事件以更新该值之前重复使用该值。

【讨论】:

  • 太棒了,正是我想要的。但是是时候阅读了,因为我不知道该怎么做。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多