在Windows CE / Win Mobile 6.1中使用Multi Thread加速问题

时间:2012-12-06 13:11:53

标签: c# windows windows-mobile windows-ce

我有一个非常慢的应用程序,在Windows CE / WindowsMo​​bile 6.1中没有明显的原因,应用程序使用线程很简单,我试图调查这是问题的原因,我写了一个简单的程序:< / p>

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace SmartDeviceProject6
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime mtStart = DateTime.Now;
            System.Diagnostics.Debug.WriteLine("{0} MainThread - START", mtStart.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));

            System.Diagnostics.Debug.WriteLine("Main Thread - Starts Here!");
            Thread t = new Thread(WriteY);          // Kick off a new thread
            t.Start();                               // running WriteY()

            // Simultaneously, do something on the main thread.
            for (int i = 0; i < 250; i++)
            {
                Console.Write("x");
                System.Diagnostics.Debug.WriteLine("x");
                System.Diagnostics.Debug.WriteIf(i == 249, "X is OVER");
                if (i == 50)
                {
                    System.Diagnostics.Debug.WriteLine("MAIN - sleep");
                    //Thread.Sleep(1000);
                }
            }
            DateTime mtEnd = DateTime.Now;
            System.Diagnostics.Debug.WriteLine("{0} MainThread - END", mtEnd.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
        }

        static void WriteY()
        {
            DateTime wtStart = DateTime.Now;
            System.Diagnostics.Debug.WriteLine("{0} WorkerThread - START", wtStart.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));

            System.Diagnostics.Debug.WriteLine("Worker Thread - Starts Here!");
            for (int i = 0; i < 250; i++)
            {
                Console.Write("Y");
                System.Diagnostics.Debug.WriteLine("Y");
                System.Diagnostics.Debug.WriteIf(i == 249, "Y is OVER");
                if (i == 100)
                {
                    System.Diagnostics.Debug.WriteLine("HIT - 100!!!");
                    //Thread.Sleep(500);
                }
            }

            DateTime wtEnd = DateTime.Now;
            System.Diagnostics.Debug.WriteLine("{0} WorkerThread - END", wtEnd.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
        }
    }
}

这是输出:

  

'SmartDeviceProject6.exe'(托管):已加载'C:\ Program   文件\ Microsoft.NET \ SDK \ CompactFramework \ v3.5版本\调试\ BCL \ mscorlib.dll中”   'SmartDeviceProject6.exe'(托管):已加载   'c:\ users \ icreate \ documents \ visual studio   2008 \项目\ smartdeviceproject6 \ smartdeviceproject6 \ BIN \调试\ SmartDeviceProject6.exe”,   符号已加载。 'SmartDeviceProject6.exe'(托管):已加载   “C:\ PROGRAM   文件\ Microsoft.NET \ SDK \ CompactFramework \ v3.5版本\调试\ BCL \ System.dll中”   12/06/2012 01:02:36.000 PM:{0} MainThread - START主线程 -   从这里开始! x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x x x x x x MAIN - 睡眠x x x x x x x   x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x   x x x x x x x x x x x x x x x x X是OVER12 / 06/202012 01:02:38.000 PM:   {0} MainThread - END线程0xf6b1b7d6已退出,代码为0   (为0x0)。 12/06/2012 01:02:38.000 PM:{0} WorkerThread - START Worker   线程 - 从这里开始! Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y.   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y Y HIT - 100 !!! Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y.   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y   是Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y是OVER12 / 06/2012   01:02:38.000 PM:{0} WorkerThread - END线程0x36be0f96具有   退出代码0(0x0)。线程0xd7be774a已退出,代码为0   (为0x0)。程序'[0xF7D3F6F6] SmartDeviceProject6.exe:Managed'有   退出代码0(0x0)。

有两件事困扰我......

1)是没有明显的线程正在进行...所有的X都被打印然后所有的Ys,如果我睡觉我可以交错代码,但似乎没有多线程正在进行...

2)这些是一些非常简单的for循环,它们不应该花费一秒钟来运行。

有没有人知道WinMobile 6.1是否支持正确的线程化?我应该使用不同的线程模型吗?我该怎么做才能加快速度?

1 个答案:

答案 0 :(得分:3)

您看到的“缓慢”与调试器连接有关。 Debug.Writeline是同步且缓慢的(Console.Writeline也不是那么快)。例如,我将它们移除并计数到2500(因此比测试大10倍)在两个循环中,在我面前的PXA270设备上只需要大约80ms。即使写入文件也不会对速度产生影响。

我确实看到了相同的“所有其他线程然后所有其他线程”,当我没有屈服的时候跑出来,但我不能说我太惊讶了。两个线程都具有相同的优先级,并且线程量子很可能是原因 - 如果你运行了更多的迭代,你就会达到量子限制并且调度程序会交换。我在每个循环中输入Thread.Sleep(0),这使得输出更像你期望的那样,并且时间仅增加到大约180ms以运行到2500(线程上下文切换是减速)。

    static void Main(string[] args)
    {
        Debug.WriteLine("Start");
        var writer = File.CreateText("\\test.txt");
        var start = Environment.TickCount;
        var are = new AutoResetEvent(false);

        var t = new Thread(delegate
            {
                for (int i = 0; i < 2500; i++)
                {
                    writer.Write(".");
                    Thread.Sleep(0);
                }
                // set an event signaling completion
                are.Set();
            });
        t.Start();

        for (int i = 0; i < 2500; i++)
        {
            writer.Write("+");
            Thread.Sleep(0);
        }
        var et = Environment.TickCount - start;
        Debug.WriteLine(string.Format("\r\nET: {0}ms", et));
        // wait for the thread to complete
        are.WaitOne();
        // this would also work
        // t.Join();
        writer.Close();

        using(var reader = File.OpenText("\\test.txt"))
        {
            var content = reader.ReadToEnd();
            Debug.WriteLine(content);
        }
    }