RunLoop入门

OK
[源码下载]

    假诺 Run loop 被显式唤醒而且时间还没超时,重启 Run loop,进入步骤 2。

在线DEMO
http://www.cnblogs.com/webabcd/archive/2009/08/04/1538238.html

    假如输入源运转,传递相应的消息。

图片 1<navigation:Page x:Class=”Silverlight30.Graphic.Projection” 
图片 2           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 3           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 4           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008
图片 5           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006
图片 6           mc:Ignorable=”d”
图片 7           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 8           Title=”Projection Page”>
图片 9    <Grid x:Name=”LayoutRoot”>
图片 10        <StackPanel>
图片 11        
图片 12            <!–
图片 13                Projection – 映射
图片 14                PlaneProjection – 将平面包车型客车 UIElement 映射到 3D
图片 15                    RotationX, RotationY, RotationZ – 绕 X轴, Y轴, Z轴 旋转的角度
图片 16                    CenterOfRotationX, CenterOfRotationY, CenterOfRotationZ – X轴, Y轴, Z轴 旋转中央点的相对地方(CenterOfRotationX, CenterOfRotationY 私下认可值为 0.5 , CenterOfRotationZ 暗中同意值为 0)
图片 17                    GlobalOffsetX, GlobalOffsetY, GlobalOffsetZ – 沿 X轴, Y轴, Z轴 的偏移量,此 3 个方向与荧屏的 3 个样子一致
图片 18                    LocalOffsetX, LocalOffsetY, LocalOffsetZ – 沿 X轴, Y轴, Z轴 的偏移量,此 3 个方向与 相关UIElement 当前的 3 个方向同样
图片 19            –>
图片 20        
图片 21            <MediaElement x:Name=”mediaElement” Source=”/Resource/Demo.mp4″ AutoPlay=”True” MediaEnded=”mediaElement_MediaEnded” Width=”320″ Height=”240″>
图片 22                <MediaElement.Projection>
图片 23                    <PlaneProjection x:Name=”projection” />
图片 24                </MediaElement.Projection>
图片 25            </MediaElement>
图片 26                        
图片 27            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationX, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationX” />
图片 28            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationY, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationY” />
图片 29            <Slider Minimum=”0″ Maximum=”360″ Value=”{Binding RotationZ, Mode=TwoWay, ElementName=projection}” ToolTipService.ToolTip=”RotationZ” />
图片 30            
图片 31        </StackPanel>
图片 32    </Grid>
图片 33</navigation:Page>
图片 34

  1. 照会观看者线程将被唤起。

  2. 拍卖未处理的事件

WriteableBitmapDemo.xaml.cs

   某一事变到达基于端口的源;

图片 35图片 36/**//*
图片 37 * WriteableBitmap – 位图 API(Bitmap API)
图片 38 * WriteableBitmap.Pixels – 一个整型数组,用于描述某像素的水彩(A奇骏GB)
图片 39 * WriteableBitmap.Render() – 将钦赐的 UIElement 以位图的措施突显出来
图片 40 * WriteableBitmap.Invalidate() – 绘图
图片 41 * WriteableBitmap.PixelWidth – 宽度。单位:像素
图片 42 * WriteableBitmap.PixelHeight – 高度。单位:像素
图片 43 */
图片 44
图片 45using System;
图片 46using System.Collections.Generic;
图片 47using System.Linq;
图片 48using System.Net;
图片 49using System.Windows;
图片 50using System.Windows.Controls;
图片 51using System.Windows.Documents;
图片 52using System.Windows.Input;
图片 53using System.Windows.Media;
图片 54using System.Windows.Media.Animation;
图片 55using System.Windows.Shapes;
图片 56using System.Windows.Navigation;
图片 57
图片 58using System.Windows.Media.Imaging;
图片 59
图片 60namespace Silverlight30.Graphic
图片 61图片 62图片 63{
图片 64    public partial class WriteableBitmapDemo : Page
图片 65图片 66    图片 67{
图片 68        public WriteableBitmapDemo()
图片 69图片 70        图片 71{
图片 72            InitializeComponent();
图片 73
图片 74            this.Loaded += new RoutedEventHandler(WriteableBitmapDemo_Loaded);
图片 75            this.Loaded += new RoutedEventHandler(WriteableBitmapDemo_Loaded2);
图片 76        }
图片 77
图片 78图片 79        /**//// <summary>
图片 80        /// 以自定义像素点颜色的方法转变位图
图片 81        /// </summary>
图片 82        void WriteableBitmapDemo_Loaded(object sender, RoutedEventArgs e)
图片 83图片 84        图片 85{
图片 86            // 先导化1个宽 40 高 20 的 WriteableBitmap 对象
图片 87            WriteableBitmap bitmap = new WriteableBitmap(40, 30);
图片 88            
图片 89            for (int i = 0; i < 40 * 30; i++)
图片 90图片 91            图片 92{
图片 93                unchecked
图片 94图片 95                图片 96{
图片 97                    // 种种像素的颜料的叙说规范为 AOdysseyGB
图片 98                    bitmap.Pixels[i] = (int)0xFFFF0000;
图片 99                }
图片 100            }
图片 101
图片 102            bitmap.Invalidate();
图片 103
图片 104            img.Source = bitmap;
图片 105        }
图片 106
图片 107图片 108        /**//// <summary>
图片 109        /// 将点名的 UIElement 以位图的不二法门做展现
图片 110        /// </summary>
图片 111        void WriteableBitmapDemo_Loaded2(object sender, RoutedEventArgs e)
图片 112图片 113        图片 114{
图片 115            WriteableBitmap bitmap = new WriteableBitmap(320, 240);
图片 116
图片 117            var txt = new TextBlock();
图片 118            txt.Text = “webabcd”;
图片 119
图片 120            // 将钦定的 TextBlock 以位图的法子表现出来
图片 121图片 122            bitmap.Render(txt, new ScaleTransform() 图片 123{ ScaleX = 320 / txt.ActualWidth, ScaleY = 240 / txt.ActualHeight });
图片 124            bitmap.Invalidate();
图片 125
图片 126            img2.Source = bitmap;
图片 127        }
图片 128
图片 129图片 130        /**//// <summary>
图片 131        /// 获取钦点图片的某像素点的颜料
图片 132        /// </summary>
图片 133        private void img3_MouseMove(object sender, MouseEventArgs e)
图片 134图片 135        图片 136{
图片 137            WriteableBitmap bitmap = new WriteableBitmap(img3, null);
图片 138
图片 139            int color = bitmap.Pixels[(int)e.GetPosition(img3).Y * (int)img3.ActualWidth + (int)e.GetPosition(img3).X];
图片 140
图片 141            // 将整型转换为字节数组
图片 142            byte[] bytes = BitConverter.GetBytes(color);
图片 143
图片 144            // 将字节数组转换为颜色(bytes[3] – A, bytes[2] – R, bytes[1] – G, bytes[0] – B)
图片 145            lbl.Text = Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]).ToString();
图片 146        }
图片 147
图片 148图片 149        /**//// <summary>
图片 150        /// 用 WriteableBitmap 完成对录像文件的截屏成效
图片 151        /// </summary>
图片 152        private void Button_Click(object sender, RoutedEventArgs e)
图片 153图片 154        图片 155{
图片 156            // 将点名的 UIElement 转换为 WriteableBitmap 对象
图片 157            WriteableBitmap bitmap = new WriteableBitmap(mediaElement, null);
图片 158
图片 159            img4.Source = bitmap;
图片 160        }
图片 161
图片 162        private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
图片 163图片 164        图片 165{
图片 166            mediaElement.Stop();
图片 167            mediaElement.Play();
图片 168        }
图片 169    }
图片 170}
图片 171

 1. 使用port或是自定义的input source来和其余线程实行通讯                
                         2. 在线程(非主线程)中使用timer              
                                                             3. 运用
performSelector…类别(如performSelectorOnThread, …)                    
     4. 接纳线程执行周期性工作

图片 172<navigation:Page x:Class=”Silverlight30.Graphic.DropShadowEffect” 
图片 173           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 174           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 175           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008
图片 176           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006
图片 177           mc:Ignorable=”d”
图片 178           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 179           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 180           Title=”DropShadowEffect Page”>
图片 181    <Grid x:Name=”LayoutRoot”>
图片 182        <StackPanel>
图片 183        
图片 184            <!–
图片 185                滤镜效果之 DropShadow
图片 186                DropShadowEffect – 阴影效果
图片 187                    DropShadowEffect.BlurRadius – 阴影的混淆半径。默许值为 5
图片 188                    DropShadowEffect.Color – 阴影的颜色。私下认可值为 FF000000
图片 189                    DropShadowEffect.Direction – 阴影相对于 UIElement 的样子。以光源从右向左照射为 0 度,度数为逆时针正增加,暗许值 315 度(即阴影在 UIElement 的右下角)
图片 190                    DropShadowEffect.Opacity – 阴影的不反射率。默许值为 1
图片 191                    DropShadowEffect.ShadowDepth – 阴影的吃水(即阴影与 UIElement 间的偏离量)。默许值为 5,有效值为 0 – 300 之间
图片 192            –>
图片 193        
图片 194            <Image Source=”/Resource/Logo.jpg”>
图片 195                <Image.Effect>
图片 196                    <DropShadowEffect x:Name=”dropShadowEffect” 
图片 197                                      BlurRadius=”5″ 
图片 198                                      Color=”Blue” 
图片 199                                      Direction=”315″ 
图片 200                                      Opacity=”1″ 
图片 201                                      ShadowDepth=”5″ />
图片 202                </Image.Effect>
图片 203            </Image>
图片 204            
图片 205            <Slider Width=”500″ Minimum=”0″ Maximum=”10″ Value=”{Binding BlurRadius, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 206            <Slider Width=”500″ Minimum=”0″ Maximum=”360″ Value=”{Binding Direction, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 207            <Slider Width=”500″ Minimum=”0″ Maximum=”1″ Value=”{Binding Opacity, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 208            <Slider Width=”500″ Minimum=”0″ Maximum=”100″ Value=”{Binding ShadowDepth, Mode=TwoWay, ElementName=dropShadowEffect}” />
图片 209            
图片 210        </StackPanel>
图片 211    </Grid>
图片 212</navigation:Page>
图片 213

  1. 照会观看者 Run loop 已经运转。

  2. 通报观看者任何即将要起始的定时器。

  3. 文告观察者任何即将开发银行的非基于端口的源。

  4. 运维任何准备好的非基于端口的源。

  5. 假如依据端口的源准备好并处于等候情形,立即运行;并跻身步骤 9。

  6. 通报观看者线程进入休眠。

  7. 将线程置于休眠直到任一下面包车型地铁风云时有产生:

从长远的角度考虑Silverlight(38) – 3.0滤镜之BlurEffect, DropShadowEffect,
自定义滤镜, 3D效果之PlaneProjection, 位图API之WriteableBitmap

    假若用户定义的定时器运转,处理定时器事件一碗水端平启 Run loop。进入步骤 2。

图片 214<navigation:Page x:Class=”Silverlight30.Graphic.WriteableBitmapDemo” 
图片 215           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 216           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 217           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008
图片 218           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006
图片 219           mc:Ignorable=”d”
图片 220           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 221           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 222           Title=”WriteableBitmapDemo Page”>
图片 223    <Grid x:Name=”LayoutRoot”>
图片 224        <StackPanel HorizontalAlignment=”Left”>
图片 225        
图片 226            <Image x:Name=”img” />
图片 227            
图片 228            <Image x:Name=”img2″ />
图片 229            
图片 230            <TextBlock x:Name=”lbl” />
图片 231            <Image x:Name=”img3″ Source=”/Resource/Logo.jpg” MouseMove=”img3_MouseMove”/>
图片 232            
图片 233            <StackPanel Orientation=”Horizontal”>
图片 234                <MediaElement x:Name=”mediaElement” Source=”/Resource/Demo.mp4″ MediaEnded=”mediaElement_MediaEnded” />
图片 235                <Button Content=”截屏” Click=”Button_Click” Width=”40″ Height=”30″ VerticalAlignment=”Center” />
图片 236                <Image x:Name=”img4″ />
图片 237            </StackPanel>
图片 238     
图片 239        </StackPanel>
图片 240    </Grid>
图片 241</navigation:Page>
图片 242

-(void)setEnd  {                                                        
                                                      end=YES;          
                                                                       
                        }

  • BlurEffect – 模糊滤镜 
  • DropShadowEffect – 阴影滤镜
  • 自定义滤镜 
  • PlaneProjection – 将平面包车型地铁 UIElement 映射到 3D
  • WriteableBitmap – 位图 API(Bitmap API)

run loop不需求创建,在线程中只要求调用[NSRunLoop
currentRunLoop]就足以博得假如大家想要等待有个别异步方法的回调。比如connection。假使大家的线程中没有运行run
loop,是不会有效应的(因为线程已经运维达成,正常退出了)。              
                   使用runLoop阻塞线程的不易写法                        
                               @implementation ViewController          
                                                                   {    
                                                                       
                                                         BOOL end;      
                                                                       
                           }

③ 、自定义滤镜的完结。滤镜库地址http://www.codeplex.com/wpffx
以下以条纹漩涡滤镜为例演示
BandedSwirlEffect.xaml

   Run loop 被显式唤醒。

四 、3D效果的言传身教
Projection.xaml

每一回运营 Run loop,你线程的 Run loop
对会自动处理从前未处理的音信,并文告有关的阅览者。具体的相继如下:

二 、阴影滤镜(DropShadowEffect)的言传身教
DropShadowEffect.xaml

   定时器运维;

图片 243<navigation:Page x:Class=”Silverlight30.Graphic.BandedSwirlEffect” 
图片 244           xmlns:effects=”clr-namespace:ShaderEffectLibrary”
图片 245           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 246           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 247           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008
图片 248           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006
图片 249           mc:Ignorable=”d”
图片 250           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 251           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 252           Title=”SwirlEffect Page”>
图片 253    <Grid x:Name=”LayoutRoot”>
图片 254        <StackPanel>
图片 255        
图片 256            <!–
图片 257                Silverlight 3.0 唯有四个放置滤镜:BlurEffect 和 DropShadowEffect
图片 258                别的更加多滤镜能够在 http://www.codeplex.com/wpffx 下载。滤镜的算法本质上的话都是依据像素的渲染器
图片 259                .fx 为滤镜源文件,编写翻译后为 .ps 文件,.cs 文件能够调用 .ps 文件,从而在 Silverlight 中显现具体的滤镜效果
图片 260                以下以一个条纹漩涡滤镜为例演示 http://www.codeplex.com/wpffx 上的滤镜库的选拔
图片 261            –>
图片 262        
图片 263            <Image Source=”/Resource/Logo.jpg”>
图片 264                <Image.Effect>
图片 265                    <effects:BandedSwirlEffect SwirlStrength=”10″ />
图片 266                </Image.Effect>
图片 267            </Image>
图片 268            
图片 269        </StackPanel>        
图片 270    </Grid>
图片 271</navigation:Page>
图片 272

– (void)viewDidLoad                                                    
                                            {                          
                                                                       
                                   [super viewDidLoad];              
                                                                       
         NSLog(@”start new thread …”);                                  
                                               [NSThread
detachNewThreadSelector:@selector(runOnNewThread)                      
   toTarget:self withObject:nil];                                      
                                             while (!end) {            
                                                                       
                       NSLog(@”runloop…”);                              
                                                               
 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:
        [NSDate distantFuture]];                                    
                                                      NSLog(@”runloop
end.”);                                                                
                          }                                            
                                                                       
          NSLog(@”ok.”);                                                
                                                  }

示例
1、模糊滤镜(BlurEffect)的以身作则
BlurEffect.xaml

   Run loop 设置的日子已经晚点;

介绍
Silverlight 3.0 图形系统的相关新增成效

  1. 通报观察者 Run loop 截至。

[索引页]
[源码下载]

Run Loop的行使场馆:

作者:webabcd

     
runLoop是线程中的循环,并对收取的风云举行处理,它从五个例外的轩然大波源中接收音讯。Input
sources(CFRunLoopSource)投递异步新闻,平日来自另3个thread或许另一个应用程序。Timer
sources(CFRunLoopTimer)当在安排的岁月或再次的岁月距离内投递同步音讯。二种事件源都使用应用程序钦赐的处理格局对到达的风浪开始展览拍卖。下图展现了run
loop和见仁见智的轩然大波源结构:

图片 273<navigation:Page x:Class=”Silverlight30.Graphic.BlurEffect” 
图片 274           xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
图片 275           xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” 
图片 276           xmlns:d=”http://schemas.microsoft.com/expression/blend/2008
图片 277           xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006
图片 278           mc:Ignorable=”d”
图片 279           xmlns:navigation=”clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation”
图片 280           d:DesignWidth=”640″ d:DesignHeight=”480″
图片 281           Title=”BlurEffect Page”>
图片 282    <Grid x:Name=”LayoutRoot”>
图片 283        <StackPanel>
图片 284        
图片 285            <!–
图片 286                滤镜效果之 Blur
图片 287                BlurEffect – 模糊效果
图片 288                    BlurEffect.Radius – 模糊半径。越大越模糊,暗许值为 5
图片 289            –>
图片 290        
图片 291            <Image Source=”/Resource/Logo.jpg”>
图片 292                <Image.Effect>
图片 293                    <BlurEffect x:Name=”blurEffect” Radius=”5″ />
图片 294                </Image.Effect>
图片 295            </Image>
图片 296            
图片 297            <Slider Width=”500″ Minimum=”0″ Maximum=”10″ Value=”{Binding Radius, Mode=TwoWay, ElementName=blurEffect}” />
图片 298            
图片 299        </StackPanel>
图片 300    </Grid>
图片 301</navigation:Page>
图片 302

伍 、应用位图 API(Bitmap API)达成常用成效的示范
WriteableBitmapDemo.xaml

-(void)runOnNewThread                                                  
                                       {                                
                                                                       
                            NSLog(@”run for new thread …”);            
                                                               
sleep(1);                                                              
                                                    [self
performSelectorOnMainThread:@selector(setEnd) withObject:nil            
          waitUntilDone:NO];                                          
                                                      NSLog(@”end.”);  
                                                                       
                      }

     
 在此之前在行使NSTimer时,际遇二个题材,NSTimer运行了,可是只会油不过生3回定时,之后就不起成效。问了同事,他说须求加在RunLoop中,小编没有设想太多,就听他说的,在外层加了一个Runloop,定时器确实起成效了。近期做另三个义务,发现RunLoop在八线程中用的可比多,所以大概查了下相关资料。