article search result of 'C#' : 94

  1. 2017.01.30 보다 심플한 C# 싱글턴 만들기
  2. 2016.11.19 상속된 Generic 타입 만들기, 타입의 제약 사항 선언 ( Generics Constraint )
  3. 2016.08.27 WebClient 를 이용한 GET 과 POST 전송하기.
  4. 2015.02.05 키넥트의 장치 ID 알아내기 (Kinect for Windows) (1)
  5. 2015.01.13 [WPF] 멀티쓰레딩 에서 GUI 렌더링과 그것의 속성을 외부에서 접근하기 (1)
  6. 2015.01.08 [C#] 리플렉션 없고 자동완성 되는 PresetLoader.cs (1)
  7. 2015.01.07 [WPF] 이미지 블러링을 원천적으로 해결하 (2)
  8. 2015.01.06 [WPF] 키보드 포커스 가져오기 / 삭제하기
  9. 2015.01.06 [WPF] UserControl 에서 간단 마우스,키보드 이벤트 수신법
  10. 2014.11.05 [WPF] 멀티쓰레드 상황에서 WPF Control 캡처 하기 (4)
  11. 2014.07.30 [메모] 이중 반복문이 느리다. (1)
  12. 2014.07.29 웹캠 포커스 강제 설정방법
  13. 2014.07.11 직렬화된 배열을 비트맵 스타일로 배열하기 , 리사이징 하기
  14. 2014.05.08 [중요 메모] STA Thread 와 COM 객체 사용시 절대 주의 할점
  15. 2014.05.08 c# Emgu 카메라 칼리브레이션 요점 정리
  16. 2014.05.07 [Marshal] byte* to byte[]
  17. 2014.05.06 [WPF] 이미지 byte[] 를 바로 BitmapSource 로 옮기자.
  18. 2014.04.08 [WPF] VisualStudio 에서 [ is not recognized or is not accessible] 에러 해결법
  19. 2013.11.28 XmlDocument 사용법 정리
  20. 2013.01.28 WPF , CacheMode (74)
  21. 2013.01.25 [Surface2]Surface2.0 Simmulator on Windows8 , Solved! (3)
  22. 2013.01.22 [Surface - WPF] Surface 에서의 에니메이션 활용 (ArtefactAnimator) (5)
  23. 2013.01.16 [.NET] 어셈블리 하나로 합치기 (ilmerge 사용안함) (6)
  24. 2013.01.16 [WPF] 트레이 아이콘 만들고 사용하기 (6)
  25. 2013.01.16 [WPF] 윈도우 닫기 명령 무시하기 (6)
  26. 2013.01.15 [asmx] 쿠키 이용하기 , (사용자 인증) (7)
  27. 2013.01.14 [SQL2012] DB 생성부터 사용자 만들기 그리고 SQL 접속하기 (4)
  28. 2013.01.11 sqlMetal 사용법 (10)
  29. 2012.12.29 Activator 를 이용한 Type Instance 생성 (32)
  30. 2012.11.27 [Broadcast Video Streaming] (149)

보다 심플한 C# 싱글턴 만들기

// simple type of c# singleton pattern
public class Communicator
{
    private static Communicator _inst;
    public static Communicator GetInst
    {
        get
        {
            return _inst;
        }
    }
    
    static Communicator()
    {
        _inst = new Communicator();
    }
    
    private Communicator()
    {
        Console.WriteLine("NEW");
    }
}



static 생성자를 통한 싱글턴 만들기.

Yamecoder 야매코더_
C# 2017. 1. 30. 17:43

댓글을 달아 주세요

상속된 Generic 타입 만들기, 타입의 제약 사항 선언 ( Generics Constraint )

출처 : 


http://www.csharpstudy.com/CSharp/CSharp-generics.aspx






Generics 타입 제약(constraint) 

C# Generics를 선언할 때, 타입 파라미터가 Value Type인지 Reference 타입인지, 또는 어떤 특정 베이스 클래스로부터 파생된 타입인지, 어떤 인터페이스를 구현한 타입인지 등등을 지정할 수 있는데, 이는 where T : 제약조건과 같은 식으로 where 뒤에 제약 조건을 붙이면 가능하다. 아래는 다양한 제약을 가한 예제들이다. 

예제

// T는 Value 타입
class MyClass<T> where T : struct 

// T는 Reference 타입
class MyClass<T> where T : class

// T는 디폴트 생성자를 가져야 함
class MyClass<T> where T : new() 

// T는 MyBase의 파생클래스이어야 함
class MyClass<T> where T : MyBase

// T는 IComparable 인터페이스를 가져야 함
class MyClass<T> where T : IComparable

// 좀 더 복잡한 제약들
class EmployeeList<T> where T : Employee,
   IEmployee, IComparable<T>, new()
{
}


Yamecoder 야매코더_
C# 2016. 11. 19. 14:35

댓글을 달아 주세요

WebClient 를 이용한 GET 과 POST 전송하기.

GET 예제 


WebClient wc = new WebClient();
StringBuilder sb = new StringBuilder();
sb.Append("https://openapi.youku.com/v2/uploads/create.json?");
sb.AppendFormat("client_id={0}", client_id);
sb.AppendFormat("&access_token={0}", access_token);
sb.AppendFormat("&title={0}", "jjongun upload test " + time_str);
sb.AppendFormat("&tags={0}", "jjongun");
sb.AppendFormat("&file_md5={0}", hashString);
sb.AppendFormat("&file_name={0}", fileName);
sb.AppendFormat("&file_size={0}", video_data.Length.ToString());

string call_upload_cmd = sb.ToString();
string result = wc.DownloadString(call_upload_cmd);
Console.WriteLine(result);


보통 DownloadString (...) 으로 해결 가능 함.





POST 예제 , string 업로드


sb.Clear();
sb.AppendFormat("upload_token={0}", upload_token);
sb.AppendFormat("&file_size={0}", file_size);
sb.AppendFormat("&ext={0}", ext);
sb.AppendFormat("&slice_length={0}", 10240);
Console.WriteLine(sb.ToString());
result = wc.UploadString(host_addr, sb.ToString());



보통 UploadString 으로 해결 가능 하며 , 상황에 따라 Data 를 전송 할 것인지, Value 들만 전달 할 것인지 결정 할 수 있다.


sb.Clear();
sb.Append(host_addr);
sb.AppendFormat("upload_token={0}", upload_token);
sb.AppendFormat("&slice_task_id={0}", slice_task_id);
sb.AppendFormat("&offset={0}", offset);
sb.AppendFormat("&length={0}", length);

var result_bytes = wc.UploadData(sb.ToString(), "POST", video_data);
result = Encoding.Default.GetString(result_bytes);


위의 예제는 binary 를 전달 한 예제 이고, 결과 역시 byte[] 로 떨어지기 때문에 문자열로 인코딩을 하여 결과를 받아야 한다.



이때 오류 상황을 잘 볼 필요가 있는데, 만약 "400" 오류 가 난다면, 서버는 작동을 하나, 파라메터와 값들이 틀렸다는 것이다. 




//추가


System.Net.Json.dll


는 매우 편리한 JSON 라이브러리 이다.


보통 OAuth 들을 사용하는 서비들의 응답이 JSON 으로 오는 경우가 허다하다. 


JsonTextParser parser = new JsonTextParser();
JsonObject json_obj;
JsonObjectCollection collection;

json_obj = parser.Parse(result);
collection = json_obj as JsonObjectCollection;
collection["video_id"].GetValue();



처럼 직관적인 사용이 가능하다.

..


 



Yamecoder 야매코더_
C# 2016. 8. 27. 18:19

댓글을 달아 주세요

키넥트의 장치 ID 알아내기 (Kinect for Windows)


마이크로 소프트 키넥트 SDK 에서는 UniqueKinectId, DeviceConnectionId 를 제공한다. 

하지만  UniqueKinectId 는 거짓이다. 다중 키넥트 사용시 모두 같은 값을 반환 한다.


그렇다면 DeviceConnectionId 은 어떠한가? 

유니크 해 보이지만, USB 포트를 달리 하거나 허브, 리피터를 꼽을때마다 바뀐다. 

그래서 실제 장치의 시리얼을 뽑을 수가 없다. 사용할 컴퓨터 마다 달라지니 말이다.




하지만 각고의 노력끝에 아래와 같은 항목을 발견 하였다.


형제 라는 항목인데, 

영문 윈도우라면 정확히 어떤 속성 이름인지 알 수 있었겠지만, 일단 [형제ID] 로 지칭 하기로 하였다.

저 아이디는 컴퓨터가 바뀌어도 어떤 키넥트를 정확히 특정 지을 수 있는 ID 이다.



(Kinect for Xbox 360) 은 형제 아이디가 없어서 확인이 불확실하다.



현제 나에게는 4개의 Kinect가 있고 형제ID 는 다음과 같다.

또한 다른 컴퓨터에서도 확인 하였다. 모두 일치하는 값을 출력 하였다.






내컴퓨터 (win7 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A



회사테스트 컴퓨터 (win7 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A




**씨 컴퓨터 (win8,1 pro)

1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A


실장님 컴퓨터 (win8,1 pro)


1번 Value: USB\VID_045E&PID_02C3\A22596W00092213A
2번 Value: USB\VID_045E&PID_02C3\A22597V01722314A
3번 Value: USB\VID_045E&PID_02C3\A22593W05102233A
4번 Value: USB\VID_045E&PID_02C3\A22596W02492224A






그리고 ManagementObjectSearcher 를 이용하였고 (https://msdn.microsoft.com/en-us/library/aa389273(v=vs.85).aspx) 을 참고 하였다.
왠만하면 컴퓨터에 연결된 장치는 다 순회 할 수 있을듯 하다.


using Microsoft.Kinect;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace USB_Detection
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


            //속도 체크용
            int c = 0;
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1);
            timer.Tick += delegate {
                this.Title = c.ToString();
                ++c;
            };
            timer.Start();
        }



        /// <summary>
        /// 키넥트의 유일한  ID 를 설정 하기 위하여 "형제" 값을 불러 와야 한다.
        /// (장치관리자->Kinect Camera->자세히->형제)
        /// </summary>
        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);

            string prefix_id = "";



            //step1
            //키넥트의 DeviceConnectionId 를 불러와 아이디의 말머리를 설정한다 (USB\\VID_045E)
            foreach (var item in KinectSensor.KinectSensors)
            {
                string[] _raw = item.DeviceConnectionId.Split('&');
                prefix_id = _raw[0];
            }


            //step2
            //모든 PNP 장치 중에서 USB Composite Device 의 이름을 찾는다.
            var Win32_PnPEntity = "Win32_PnPEntity where Name like 'USB Composite Device'";
            var query = string.Format("select * from {0}", Win32_PnPEntity);
            


            using (var searcher = new ManagementObjectSearcher(query))
            {
                ManagementObjectCollection objectCollection = searcher.Get();
                ManagementBaseObject brotherKinectDev = null;

                Console.WriteLine(objectCollection.Count);
                foreach (ManagementBaseObject managementBaseObject in objectCollection)
                {
                    foreach (PropertyData propertyData in managementBaseObject.Properties)
                    {
                        //참고 : 모든 속성 가져 오기
                        //content.AppendLine(string.Format("Property:  {0}, Value: {1}", propertyData.Name, propertyData.Value));
                        if (propertyData.Name == "HardwareID")
                        {
                            foreach (var _item in (string[])propertyData.Value)
                            {

                                //그중에서 하드웨어 아이디의 값이 DeviceConnectionId 말머리가 포함된것을 찾는다.
                                if (_item.IndexOf(prefix_id) > -1)
                                {
                                    brotherKinectDev = managementBaseObject;
                                    break;
                                }
                            }
                        }
                    }
                }



                //step3
                //검색된 장치의 PNPDeviceID 를 가져온다
                if (brotherKinectDev != null)
                {
                    foreach (PropertyData propertyData in brotherKinectDev.Properties)
                    {
                        if (propertyData.Name == "PNPDeviceID")
                        {
                            tx.Text = string.Format("Value: {0}", propertyData.Value);
                        }
                    }
                }
            }

            Console.WriteLine("complete");
        }
    }
}


Yamecoder 야매코더_
C# 2015. 2. 5. 17:00

댓글을 달아 주세요

  1. 匿名 2015.02.11 14:03  수정/삭제  댓글쓰기

    메그永恒之塔服务端传奇服务端密传-服务端QQ西游私服务端天堂1私服务端

    千年服务端蜀门服务端征途服务端机战服务端神泣服务端醉西游服务端

    天堂I服务端挑战OL服务端剑侠情缘-服务端奇侠XIAH服务端挑战服务端


    传世开私服一条龙服务-

    传奇开私服一条龙开区服务-


    传奇广告代理-

    IDC服务器以及空间租用-

    魔兽世界sf开服一条龙服务-


    客服咨询QQ(企鹅扣扣)1285574370

    Email:1285574370@qq.com

    更多商业版本免费开放下载




    天恒科技1.95皓月终极12星座道士加强升级版



    天恒科技1.85荣耀必杀极限之地广寒宫泡点元素PK版



    天恒科技1.85无特戒无英雄轻中变魔神唯我独尊麻痹宝宝



    天恒科技独家1.85恶魔世界装备分身15转八钻靓装元素中变版다에

[WPF] 멀티쓰레딩 에서 GUI 렌더링과 그것의 속성을 외부에서 접근하기

이전글 을 참고 하자 (http://scripter.co.kr/274

이전 버전은 쓰레드 안에서 View 를 생성하여 while 루프 안에서 RenderTargetBitmap(이하 RTB) 로 찍어 내는 방식이었다.


하지만 쓰레드 안에서 생성한 Element 는 CompositionTarget 등 Dispathcer 관련 서비스를 이용 할 수 없었다.

그래서 전역 메모리 공유 (멤버 변수) 를 통하여 좌표 라던지 크기 등 GUI 요소에 간접 접근 하는 방법 밖에 없었다.


직접 접근 하려면 , 아래와 같은 에러를 볼 수 있다.




그래서 앞서 설명 한 것 처럼 간접 접근을 통하여 while 루프에서 변경을 체크 하여 적용 할 수 밖에 없었는데, 이러한 점 때문에 약간의 딜레이를 감수 해야 했었다.



그리고 이러한 점을 개선 한 방법을 기록한다.


원문 : http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx





우선 아래와 같은 클래스가 필요하다. VisualTargetPresentationSource.cs


using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Markup;

namespace JUtil
{

    /// original post : http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx
    /// 
    /// 
    /// 
    /// <summary>
    ///     The VisualTargetPresentationSource represents the root
    ///     of a visual subtree owned by a different thread that the
    ///     visual tree in which is is displayed.
    /// </summary>
    /// <remarks>
    ///     A HostVisual belongs to the same UI thread that owns the
    ///     visual tree in which it resides.
    ///     
    ///     A HostVisual can reference a VisualTarget owned by another
    ///     thread.
    ///     
    ///     A VisualTarget has a root visual. 
    ///     
    ///     VisualTargetPresentationSource wraps the VisualTarget and
    ///     enables basic functionality like Loaded, which depends on
    ///     a PresentationSource being available.
    /// </remarks>
    public class VisualTargetPresentationSource : PresentationSource
    {
        public VisualTargetPresentationSource(HostVisual hostVisual)
        {
            _visualTarget = new VisualTarget(hostVisual);
        }

        public override Visual RootVisual
        {
            get
            {
                return _visualTarget.RootVisual;
            }

            set
            {
                Visual oldRoot = _visualTarget.RootVisual;


                // Set the root visual of the VisualTarget.  This visual will
                // now be used to visually compose the scene.
                _visualTarget.RootVisual = value;

                // Hook the SizeChanged event on framework elements for all
                // future changed to the layout size of our root, and manually
                // trigger a size change.
                FrameworkElement rootFE = value as FrameworkElement;
                if (rootFE != null)
                {
                    rootFE.SizeChanged += new SizeChangedEventHandler(root_SizeChanged);
                    rootFE.DataContext = _dataContext;

                    // HACK!
                    if (_propertyName != null)
                    {
                        Binding myBinding = new Binding(_propertyName);
                        myBinding.Source = _dataContext;
                        rootFE.SetBinding(TextBlock.TextProperty, myBinding);
                    }
                }

                // Tell the PresentationSource that the root visual has
                // changed.  This kicks off a bunch of stuff like the
                // Loaded event.
                RootChanged(oldRoot, value);

                // Kickoff layout...
                UIElement rootElement = value as UIElement;
                if (rootElement != null)
                {
                    rootElement.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
                    rootElement.Arrange(new Rect(rootElement.DesiredSize));
                }
            }
        }

        public object DataContext
        {
            get { return _dataContext; }
            set
            {
                _dataContext = value;
                var rootElement = _visualTarget.RootVisual as FrameworkElement;
                if (rootElement != null)
                {
                    rootElement.DataContext = _dataContext;
                }
            }
        }

        // HACK!
        public string PropertyName
        {
            get { return _propertyName; }
            set
            {
                _propertyName = value;

                var rootElement = _visualTarget.RootVisual as TextBlock;
                if (rootElement != null)
                {
                    if (!rootElement.CheckAccess())
                    {
                        throw new InvalidOperationException("What?");
                    }

                    Binding myBinding = new Binding(_propertyName);
                    myBinding.Source = _dataContext;
                    rootElement.SetBinding(TextBlock.TextProperty, myBinding);
                }
            }
        }

        public event SizeChangedEventHandler SizeChanged;

        public override bool IsDisposed
        {
            get
            {
                // We don't support disposing this object.
                return false;
            }
        }

        protected override CompositionTarget GetCompositionTargetCore()
        {
            return _visualTarget;
        }

        private void root_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            SizeChangedEventHandler handler = SizeChanged;
            if (handler != null)
            {
                handler(this, e);
            }
        }

        private VisualTarget _visualTarget;
        private object _dataContext;
        private string _propertyName;
    }







    /// <summary>
    ///     The VisualWrapper simply integrates a raw Visual child into a tree
    ///     of FrameworkElements.
    /// </summary>
    [ContentProperty("Child")]
    public class VisualWrapper<T> : FrameworkElement where T : Visual
    {
        public T Child
        {
            get
            {
                return _child;
            }

            set
            {
                if (_child != null)
                {
                    RemoveVisualChild(_child);
                }

                _child = value;

                if (_child != null)
                {
                    AddVisualChild(_child);
                }
            }
        }

        protected override Visual GetVisualChild(int index)
        {
            if (_child != null && index == 0)
            {
                return _child;
            }
            else
            {
                throw new ArgumentOutOfRangeException("index");
            }
        }

        protected override int VisualChildrenCount
        {
            get
            {
                return _child != null ? 1 : 0;
            }
        }

        private T _child;
    }

    /// <summary>
    ///     The VisualWrapper simply integrates a raw Visual child into a tree
    ///     of FrameworkElements.
    /// </summary>
    public class VisualWrapper : VisualWrapper<Visual>
    {
    }
}












그리고 렌더링 할 UserControl 에 아레와 같은 코드를 넣는다.

주요 기능은 DispatcherTimer 로 지속적으로 화면을 캡처 하여 비트맵으로 만든다.


이때 CompositionTarget 보다 DispatcherTimer가 더욱 지속적이고 처리 속도도 원활 했다. 





using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using Tracker.util;

namespace CrossUiThreading
{
    /// <summary>
    /// Interaction logic for ThreadView.xaml
    /// </summary>
    public partial class ThreadView : UserControl
    {
        //test props
        public static ThreadView _this;
        public static Bitmap _bitmap;
        public static BitmapSource _bsrc;
        public static int _updateCount = 0;
        public static Planerator.Planerator PL2;
        public static int _fps;



        private System.Windows.Media.Imaging.RenderTargetBitmap capture;
        private FPSCounter _fpsCounter = new FPSCounter();
        
        public ThreadView()
        {
            InitializeComponent();

            _this = this;
            this.Loaded += ThreadView_Loaded;
        }

        void ThreadView_Loaded(object sender, RoutedEventArgs e)
        {
            capture = new System.Windows.Media.Imaging.RenderTargetBitmap((int)this.ActualWidth, (int)this.ActualHeight, 96, 96, System.Windows.Media.PixelFormats.Default);
            this.Arrange(new System.Windows.Rect(0, 0, 1320, 320));

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromTicks(100);
            timer.Tick += timer_Tick;
            timer.Start();
            PL2 = _pl2;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            Render();
        }

        float c = 0;
        private void Render()
        {
            //test move
            double v = 500 + Math.Cos(c) * 100;
            c += 0.1f;
            Canvas.SetLeft(_thumb, v);
            _p1.RotationX = v;


            //bitmap capture 
            capture.Render(this);
            _bitmap = BitmapConvert.BsrcToBitmap(capture);
            _fps = _fpsCounter._CalculateFrameRate();
            _updateCount++;
        }
    }
}







마지막으로 활용이다.


하단에 보면 Invoke 가 가능함을 테스트 할 수 있는 코드가 있다.


using JUtil;
using System;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using Tracker.util;

namespace CrossUiThreading
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private static AutoResetEvent s_event = new AutoResetEvent(false);
        private FPSCounter _fpsConter = new FPSCounter();
        private int old_count = 0;
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            this.Loaded -= MainWindow_Loaded;


            CreateMediaElementOnWorkerThread();
            CompositionTarget.Rendering += CompositionTarget_Rendering;
        }

        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            this.Title = string.Format("{0} , {1}", _fpsConter._CalculateFrameRate() , ThreadView._fps);

            if (old_count != ThreadView._updateCount)
            {
                System.Drawing.Bitmap bmp = ThreadView._bitmap;
                if (bmp == null)
                    return;

                _img.Source = BitmapConvert.ToBitmapSourceForGDI(bmp);
            }
            old_count = ThreadView._updateCount;
        }

        private HostVisual CreateMediaElementOnWorkerThread()
        {
            HostVisual hostVisual = new HostVisual();

            Thread thread = new Thread(new ParameterizedThreadStart(MediaWorkerThread));
            thread.SetApartmentState(ApartmentState.STA);
            thread.IsBackground = true;
            thread.Start(hostVisual);

            s_event.WaitOne();

            return hostVisual;
        }


        private void MediaWorkerThread(object arg)
        {
            HostVisual hostVisual = (HostVisual)arg;
            VisualTargetPresentationSource visualTargetPS = new VisualTargetPresentationSource(hostVisual);
            s_event.Set();

            ThreadView threadview = new ThreadView();
            visualTargetPS.RootVisual = threadview;//CreateMediaElement();
            System.Windows.Threading.Dispatcher.Run(); //중요!
        }





        /*
         * 다른 스레드에서 속성 접근 가능 
         * 
         * */
        private void Window_KeyUp_1(object sender, KeyEventArgs e)
        {
            if (Key.A == e.Key)
            {
                //별도 쓰레드에서 생성한 객체의 Dispatcher.Invoke 가능!
                ThreadView._this.Dispatcher.Invoke(new Action(()=>{
                    ThreadView.PL2.RotationZ++;
                }));

            }

            //에러!
            //ThreadView.PL2.RotationZ++;
        }
    }
}






이로서 다른 쓰레드에서 생성한 GUI 요소 일 지라도 Dispatcher 로 가능하다.



System.Windows.Threading.Dispatcher.Run();

이것을 성공시키기 위한 아주 중요한 부분이다.


프로젝트 : 

CrossUiThreading.zip



Yamecoder 야매코더_
C# 2015. 1. 13. 21:47

댓글을 달아 주세요

  1. BlogIcon Michael Kors Handbags 2015.02.05 04:43  수정/삭제  댓글쓰기

    일를Michael Kors Outet Online
    Michael Kors Handbags
    Michael Kors Outet Online
    Michael Kors Outet
    Michael Kors Purses
    Michael Kors Outet Online
    Michael Kors Outet Online
    Michael Kors Purses
    Michael Kors Handbags
    Michael Kors Outet를일

[C#] 리플렉션 없고 자동완성 되는 PresetLoader.cs



비주얼 스튜디오 에서 기본 제공해 주는 *.config 는 상당히 편리한 구석이 있으나 문서 자체가 너무 복잡하게 되어 버릴 경우가 많아서 사용자에게 xml 을 수정 하라는 요구를 하기가 사뭇 꺼려 진다.


하지만 문자열로 xml의 값을 하나 하나 불러 오는것도 인간적인 실수 와 더불어 사용 코드가 그리 깔끔하지 않아 불편함이 있다.

그래서 개선한 버전인 클래스 필드의 변수를 리플렉션 하여 얻어와 값을 인위적으로 넣어 주는 방법이 있었는데, 리플렉션 역시 사용 환경에 따라 제약이 생길 수 있다. (난독화, MONO ,  등등)






그래서 셋팅값의 자동완성도 가능하면서 리플렉션도 사용하지 않는 PresetLoader 를 만들었고 그것의 실체와 사용법은 아래와 같다. 



// // PresetLoader.cs // CallbackTest // // Created by SuperSc on 2015. 1. 8.. // Copyright (c) 2015년 SuperSc. All rights reserved. // using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml.Linq; namespace PresetLoader { /* * 실제 사용 예시 * new PresetLoader(); string name = PresetLoader.GetValue(PresetLoader.PresetProp.string_name); int age = PresetLoader.GetValue(PresetLoader.PresetProp.int_age); float fv = PresetLoader.GetValue(PresetLoader.PresetProp.float_floatvalue); int[] bodytypes = PresetLoader.GetValue(PresetLoader.PresetProp.ints_bodyvalues); float[] floats = PresetLoader.GetValue(PresetLoader.PresetProp.floats_floatvalues); string[] alias = PresetLoader.GetValue(PresetLoader.PresetProp.strings_alias); * * */ public class PresetLoader { /* * PresetProp Enum 안에 사용할 Preset 값들을 정의 합니다. * * 선언법 : [값 타입](s)_[이름] * 배열타입으로 선언하기 : [값 타입] 뒤에 s 형태로 복수영문을 표현 하면 배열로 인식 합니다. * * * 예시 : * 1) int_age // int 형인 속성 age * 2) ints_numbers // int[] 형인 numbers 배열 * * */ public enum PresetProp { int_age , float_floatvalue, floats_floatvalues, ints_bodyvalues , string_name, strings_alias } /* * 이 메서드를 이용하여 Preset의 값을 찾아 냅니다. * 극 장점은 바로 자동완성이 된다는 점 입니다. * * 사용법 : int[] numbers = PresetLoader.GetValue(PresetLoader.PresetProp.numbers); * */ public static dynamic GetValue(PresetProp name) { PropTypeValue resultItem = default(PropTypeValue); foreach (PropTypeValue item in _proplist) { if (item.prop_enum_object == name) { resultItem = item; break; } } return resultItem.prop_value; } //---------------------------------------------------------------------PresetLoader #region //---------------------------------------------------------------------define PropTypeValue private struct PropTypeValue { public PresetProp prop_enum_object; public bool prop_isArray; public string prop_name; public Type prop_type; public dynamic prop_value; } //---------------------------------------------------------------------Initializer #region private static readonly string PresetFileName = "Preset.xml"; private static List<PropTypeValue> _proplist; private static XElement _preset_xml; public PresetLoader() { _proplist = new List<PropTypeValue>(); foreach (string item in Enum.GetNames(typeof(PresetProp))) { string[] item_split = item.Split('_'); string _raw_type_name = item_split[0]; string _raw_prop_name = item_split[1]; bool _raw_isArray = false; PresetProp _raw_enum = (PresetProp)Enum.Parse(typeof(PresetProp), item); Type _raw_type = DefineTypeFromString(_raw_type_name); if (_raw_type_name.Substring(_raw_type_name.Length - 1) == "s") { _raw_isArray = true; } _proplist.Add(new PropTypeValue() { prop_enum_object = _raw_enum, prop_isArray = _raw_isArray, prop_name = _raw_prop_name, prop_type = _raw_type, prop_value = null }); } PresetXMLProgress(); //결과 화면 표시 Console.WriteLine("=======preset load reslut======="); foreach (var item in _proplist) { Console.WriteLine("PropName(enum) : " + item.prop_enum_object +" name: " + item.prop_name + " type: " + item.prop_type + " value: " + item.prop_value); } } private Type DefineTypeFromString(string value) { Type result = typeof(string); switch (value.ToLower()) { case "string": result = typeof(string); break; case "strings": result = typeof(string[]); break; case "int": result = typeof(int); break; case "ints": result = typeof(int[]); break; case "float": result = typeof(float); break; case "floats": result = typeof(float[]); break; default : throw new Exception("can't definition type"); } return result; } #endregion //---------------------------------------------------------------------Progress #region private void PresetXMLProgress() { MakeXML(); ReadXML(); } /* * XML 파일을 체크 하여 없다면 새로 생성. * 결과를 전역 변수 _preset_xml 로 대입 * */ private void MakeXML() { if (File.Exists(PresetFileName) == true) { _preset_xml = XElement.Parse(File.ReadAllText(PresetFileName)); return; } XElement xml = new XElement("root"); xml.Add( new XComment(string.Format("{0}{1}{2}", Environment.NewLine, " 0 으로 되어 있는 값을 입력하여야 합니다. 이름뒤에s가 붙은 배열 타입은 ',' 로 구분 합니다. \n (예시> <ints>30,20,10</ints> )" , Environment.NewLine) )); foreach (var item in _proplist) { xml.Add(new XElement(item.prop_name, "0")); } xml.Save(PresetFileName); Console.WriteLine("---create new preset xml---"); Console.WriteLine(xml.ToString()); _preset_xml = xml; } /* * XML 을 읽는 도중 누락된 항목이 발견되면 파일을 리셋. * */ private void ReadXML() { try { for (int i = 0; i < _proplist.Count; i++) { dynamic value = ValueParser(_proplist[i], _preset_xml.Element(_proplist[i].prop_name).Value);//Convert.ChangeType(_preset_xml.Element(_proplist[i].prop_name).Value, _proplist[i].prop_type); PropTypeValue newValue = _proplist[i]; newValue.prop_value = value; _proplist[i] = newValue; } } catch(NullReferenceException) { Console.WriteLine("ERR! > XML Parse Error "); File.Delete(PresetFileName); PresetXMLProgress(); } } /* * 속성의 type들을 검사 하여 실제 값(xml의 값)을 파싱 하여 대입. * */ private dynamic ValueParser(PropTypeValue target , string xml_value) { dynamic result = null; if (target.prop_isArray == true) { string[] raw_values = xml_value.Split(','); if (target.prop_type == typeof(int[])) { result = CovertArray<int>(raw_values); } else if (target.prop_type == typeof(System.Single[])) { result = CovertArray<float>(raw_values); } else if (target.prop_type == typeof(string[])) { result = CovertArray<string>(raw_values); } } else { result = Convert.ChangeType(xml_value, target.prop_type); } return result; } /* * 배열 타입의 속성을 위한 템플릿 유틸 메서드. * */ private T[] CovertArray<T>(string[] raw_values) { T[] arr = new T[raw_values.Length]; for (int i = 0; i < raw_values.Length; i++) { arr[i] = (dynamic)Convert.ChangeType(raw_values[i], typeof(T)); } return arr; } #endregion #endregion } }



Yamecoder 야매코더_
C# 2015. 1. 8. 17:27

댓글을 달아 주세요

  1. BlogIcon burberry parfum pas cher 2015.03.27 21:10  수정/삭제  댓글쓰기

    가는mais dans l'identit&eacute; authentique &agrave; un prix &eacute;quitable.
    Lin a dit que si le bloc est l'intersect. " Yuanmingyuan; parfait brillant Park. 王文泰 Xuanzang Gaochang &agrave;" or 120, dans leur combat. vous jeter les ordures &agrave; jeter &agrave; la poubelle. de ne plus toucher le coq d'or; deuxi&egrave;mement,| coeur | de beaut&eacute; la publication imm&eacute;diate de commandes.료료

[WPF] 이미지 블러링을 원천적으로 해결하




XAML 로 이미지를 위치 시킬경우 빌드 하면 가끔씩 이미지가 흐려 보이는 현상이 보일때가 있다. 

이것을 해결 하려 구글링 하면 SnapsToDevicePixels , RenderOptions , UseLayoutRounding 등등의 방법이 난무 하지만 잘 안먹힐때가 많이 있다.


또한 이러한 현상은 왠지 낯설지가 않다.

플래시 에서도 이러한 현상을 볼 수 있는데, 이유는 픽셀 시작점이 정수가 아니라 소수점으로 떨어 질 경우 정확한 필셀이 화면에 그려지지 않고 두 픽셀에 걸쳐서 색을 섞어 버리니 결국 흐려 보이는 것이다.


이러한 배경을 가지고 실제로 포지션을 구해보면, ...



Window window = Window.GetWindow(target);
Point actualTargetPoint = target.TransformToAncestor(window).Transform(new Point(0, 0));



(target 은 이미지 객체나 텍스쳐를 활용하는 UIElement 가 되겠다)

actualTargetPoint 의 X 나 Y 값이 정수가 아닌 소수점으로 떨어지는것을 볼 수 있다. 예를 들어 (123.32,342.5)

(참고로 WPF 는 double 형의 포지션 을 가진다.)


그래서 이것을 인위적으로 소수점 자리만큼 빼주어 정상 위치를 확보 할 수 있다.


간단히 말해 소수점이 발생하는 X Y 포인트를 가장 가까운 정수 자리로 Translation 해준다.

이것을 구현 하는 코드는 아래와 같다.




        public static void PixelSnapping(UIElement target)
        {
            Window window = Window.GetWindow(target);
            Point actualTargetPoint = target.TransformToAncestor(window).Transform(new Point(0, 0));
            int _vx = (int)actualTargetPoint.X;
            double result = actualTargetPoint.X - _vx;

            double push_x = GetPushValue(actualTargetPoint.X);
            double push_y = GetPushValue(actualTargetPoint.Y);

            target.RenderTransform = new TranslateTransform(push_x, push_y);
        }


        /*
         * 입력값이 가장 가까운 정수로 가기위한 소수점 값을 반환한다.
         * */
        public static double GetPushValue(double orignal_value)
        {
            double round_value = Math.Round(orignal_value);
            double pushPosition = 0;

            if (orignal_value < round_value)
            {
                pushPosition = (orignal_value - round_value) * -1;
            }
            else
            {
                pushPosition = round_value - orignal_value;
            }

            return pushPosition;
        }



활용은 간단히 객체를 넣어 주면 된다.

ImageUtil.PixelSnapping(_topLogo);



그러면 결과는 아래와 같다.








//comment : 2015.01.09

PixelSnapping 을 사용할 경우 비주얼 스튜디오의 XAML 디자인뷰 에서 에러가 날 수 있는데 이때는 try...catch 로 감싸 주면 된다.




Yamecoder 야매코더_
C# 2015. 1. 7. 17:24

댓글을 달아 주세요

  1. 匿名 2015.01.07 17:48  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  2. BlogIcon Michael Kors Handbags 2015.03.03 04:13  수정/삭제  댓글쓰기

    예버Michael Kors Outet Online
    Michael Kors Handbags
    Michael Kors Outet Online
    Michael Kors Outet
    Michael Kors Purses
    Michael Kors Outet
    Michael Kors Outet Online
    Michael Kors Handbags
    Michael Kors Outet Online
    Michael Kors Purses런메

[WPF] 키보드 포커스 가져오기 / 삭제하기


키보드로 컨트롤이 절실한 경우가 있다. 컨트롤 들의 미세한 컨트를을 위해서 이다.(예를 들면 Slider 류) 

그런데 한 화면에 Textbox 가 있고, 이것은 키보드 포커스를 뺏어가서 반환 하지 않는다. 그래서 아래와 같은 방법으로 처리 할 수 있다.



0. 그전에, 사용자의 컨트롤 밖에 클릭을 감지 하기 위해 현제 윈도우의 마우스 이벤트를 이용하여 포커스를 죽여도 좋다는 상황을 만들어 보자.

아래의 메서드를 이용한다.


        /*
         * 사용방법
         *  Window.GetWindow(this).PreviewMouseDown += MainWindow_PreviewMouseDown;
         *          ...
         *  void MainWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
            {
                Window.GetWindow(this).PreviewMouseDown -= MainWindow_PreviewMouseDown;
                Point pt = e.GetPosition((UIElement)sender);
                bool result = HitUtil.HitVisualFromMainWindow(pt, this);
         
                Console.WriteLine(">>>>>>>>>>>>" + result);
                if (result == false)
                {
                    //out interesting
                }
            }
         * 
         * 
         * */

        public static bool HitVisualFromMainWindow(Point globalMousePoint, UIElement target)
        {
            Window window = Window.GetWindow(target);

            Point actualTargetPoint = target.TransformToAncestor(window).Transform(new Point(0, 0));
            Point r_pt = new Point(globalMousePoint.X - actualTargetPoint.X, globalMousePoint.Y - actualTargetPoint.Y);
            HitTestResult result = VisualTreeHelper.HitTest(target, r_pt);
            if (result != null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


그럼 위의 메서드를 활용하여 ..




1. 텍스트 박스의 포커스를 반환 하는법

        //-----------------------------------------------------------------events

        private void _tf_GotKeyboardFocus_1(object sender, KeyboardFocusChangedEventArgs e)
        {
            Window.GetWindow(this).PreviewMouseDown -= MainWindow_PreviewMouseDown;
            Window.GetWindow(this).PreviewMouseDown += MainWindow_PreviewMouseDown;
        }

        private void MainWindow_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Window.GetWindow(this).PreviewMouseDown -= MainWindow_PreviewMouseDown;
            Point pt = e.GetPosition((UIElement)sender);
            bool result = HitUtil.HitVisualFromMainWindow(pt, this);
            if (result == false)
            {
                Keyboard.ClearFocus();
            }
        }


바로 Keyboard.ClearFocus() 를 호출하면 깔끔히 포커스를 반환 한다





2. 그렇다면, 이제 다른 컨트롤에 포커스를 할당 하여 보자. (마우스로 클릭과 동시에...)


        public SNCircleThumb()
        {
            InitializeComponent();
            this.Focusable = true; //중요!
        }





        //----------------------------------------------------------events

        #region

        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            this.Focus(); //중요!

            Console.WriteLine("req focus");
        }

        //키보드 테스트
        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            base.OnPreviewKeyDown(e);
            Console.WriteLine("press Key : " + e.Key);
        }


 중요 라고 주석 한 곳을 참고 한다.

ㅁㅁ




위 와 같은 방법으로 비 텍스트필드 류의 컨트롤 에도 포커스를 할당 할 수 있다.


Yamecoder 야매코더_
C# 2015. 1. 6. 18:15

댓글을 달아 주세요

[WPF] UserControl 에서 간단 마우스,키보드 이벤트 수신법


지울 필요가 없거나 충분히 on off 를 조절 하여 사용할 수 있는 환경이라면 구지 XAML 이나 += 로 추가 하지 않아도 아래와 같은 방법으로 override 하여 사용하면 깔끔하다.


 

        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            this.Focus();

            Console.WriteLine("req focus");
        }

        protected override void OnMouseEnter(MouseEventArgs e)
        {
            ((SolidColorBrush)(_circle.Fill)).Color = OverColor;
        }

        protected override void OnMouseLeave(MouseEventArgs e)
        {
            ((SolidColorBrush)(_circle.Fill)).Color = NormalColor;
        }


        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            base.OnPreviewKeyDown(e);
            Keyboard_Press_ArrowType key_type = Keyboard_Press_ArrowType.NONE;
            if (e.Key == Key.OemComma)
            {
                key_type = Keyboard_Press_ArrowType.LEFT;
            }
            else if (e.Key == Key.OemPeriod)
            {
                key_type = Keyboard_Press_ArrowType.RIGHT;
            }

            if (key_type != Keyboard_Press_ArrowType.NONE)
            {
                if (KeyboardPressEvent != null)
                {
                    KeyboardPressEvent(this, new SNCircleThumbEvent() { keyPressType = key_type });
                }
            }
        }


Yamecoder 야매코더_
C# 2015. 1. 6. 18:03

댓글을 달아 주세요

[WPF] 멀티쓰레드 상황에서 WPF Control 캡처 하기

WPF 의 Shape 그리기나 , Shader Effect , Brushes 등등이 WPF 를 사용하면 아주 쉽고 처리속도에도 이점이 많다. 하지만 일반적인 방법으로는 메인쓰레드에서만 비주얼 요소를 사용할 수 있어 사용이 제한적이고 , 별도의 프로세싱을 위하여 사용 할 경우 CPU 사용량이 높아져 전체적인 GUI 가 버벅되는 현상이 발생 할 수도 있다.


이를 극복하기 위하여 멀티 쓰레드 상황에서 WPF 컨트롤에 접근 하는 방법을 알아 보자.



using System;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using WPF_Tilt;

namespace ThreadCaptureWPFTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Thread captureThread;
        public MainWindow()
        {
            InitializeComponent();


            //쓰레드 생성
            captureThread = new Thread(new ThreadStart(Ready));
            // STA 형태의 쓰레드 이여야 함
            captureThread.SetApartmentState(ApartmentState.STA); 
        }


        // 쓰레드
        private void Ready()
        {
            //ViewBox, Grid , Canvas 등.. 생성
            Grid vb = new Grid();

            //XAML 로 만든 UserControl 도 가능함.
            vb.Children.Add(new View());
            vb.Arrange(new Rect(0, 0, 500, 500)); //중요!

            //RenderTargetBitmap 생성
            RenderTargetBitmap capture = new RenderTargetBitmap((int)vb.ActualWidth, (int)vb.ActualHeight, 96, 96, PixelFormats.Default);
            capture.Render(vb);

            var bmp = BitmapConvertUtil.ToBitmap(capture);
            bmp.Save(@"TestCap1.jpg");
            Console.WriteLine("CAP!"); 
        }



        private void root_KeyUp_1(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.A)
            {
                captureThread.Start();
            }
        }
    }
}

 


Yamecoder 야매코더_
C# 2014. 11. 5. 14:23

댓글을 달아 주세요

  1. BlogIcon 眼镜批发市场 2014.11.12 00:52  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  2. BlogIcon picasa web giubbotti moncler 2014.11.12 11:45  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  3. BlogIcon moncler jackets ladies 2014.11.12 11:46  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  4. BlogIcon canada goose jackets outlet 2014.11.28 08:27  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

[메모] 이중 반복문이 느리다.

                if (true)
                {
                    int c = 0 , d = 0;
                    int x = 0, y = 0;

                    for (int i = 0; i < this.depthPixels.Length; i++)
                    {
                        if (i % depthWidth == 0 && i > 0)
                        {
                            ++y;
                            x = 0;
                        }

                        if (this.depthPixels[i].PlayerIndex > 0)
                        {
                            maskedImage.Data[y, x, 0] = 30;
                            maskedImage.Data[y, x, 1] = 250;
                            maskedImage.Data[y, x, 2] = 30;
                        }

                        ++x;
                    }

                    #region
                    // 아래와 같이 x y 이중 반복문은 위의 알고리즘 보다 훨씬 느리다.
                    //for (int x = 0; x < maskedImage.Height; x++)
                    //{
                    //    for (int y = 0; y < maskedImage.Width; y++)
                    //    {
                    //        if(this.depthPixels[c].PlayerIndex > 0)
                    //        {
                    //            maskedImage.Data[x, y, 0] = 30;
                    //            maskedImage.Data[x, y, 1] = 250;
                    //            maskedImage.Data[x, y, 2] = 30;

                    //            ++d;
                    //        }
                    //        ++c;
                    //    }
                    //}
                    #endregion
                }
Yamecoder 야매코더_
C# 2014. 7. 30. 18:09

댓글을 달아 주세요

  1. BlogIcon 匿名 2014.08.19 14:29  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

웹캠 포커스 강제 설정방법

로지텍 캠의 고질적인 문제는 오토포커스 설정이 재부팅 시 원복 된다는 점이다. 

그러나 아래의 DirectShow  를 이용한 메서드 들로 해결 할 수 있다.



( 출처 :  http://stackoverflow.com/questions/18124646/manually-focus-camera-in-emgu-cv)


        private void SetCameraControl()
        {
            Console.WriteLine("Camera Setting ! ");

            DsDevice dev = GetPCCamDev();
            if (dev == null) return;

            IFilterGraph2 graphBuilder = new FilterGraph() as IFilterGraph2;
            IBaseFilter capFilter = null;
            if (graphBuilder != null)
                graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter); //getting capture filter for converting it into IAMCameraControl
            IAMCameraControl _camera = capFilter as IAMCameraControl;
            _camera.Set(CameraControlProperty.Focus, 0, CameraControlFlags.Manual); //Setting focus to macro (in my camera, range between 0 - 250)
        }

        private DsDevice GetPCCamDev()
        {
            DsDevice[] devs = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
            foreach (var item in devs)
            {
                if (item.Name.StartsWith("Point Grey") == true) continue;

                Console.WriteLine(item.Name);
            }
            return devs[0];
        }


Yamecoder 야매코더_
C# 2014. 7. 29. 13:43

댓글을 달아 주세요

직렬화된 배열을 비트맵 스타일로 배열하기 , 리사이징 하기

1) 직렬화된 배열을 비트맵 스타일로 배열하기 , 

2) 직렬화된 배열을 비트맵 스타일로 리사이징 하기


위의 요건이 이번 프로젝트 에 필요하게 되었다.


상황은 키넥트에서 받는 DepthFrame 을 이용하여 유니티에서 1:1 로 파티클을 매칭 한다.

이때 파티클은 1개의 매쉬 에 동적으로 그려진 버텍스 들이다. 


그리고 버택스 개수는 약 6만5천개로 제한적이다.


그리고 일정 개수 이상 넘어 가고, 이것들을 루프에 돌릴때, 메인쓰레드의 FPS 가 떨어지는 불상사가 일어난다.


그래서 품질과 퍼포먼서의 적정 수준인 160 x 120 해상도의 DepthFrame 이 필요한데, 안타깝게도 키넥트에서는 저 해상도를 지원하지 않는다.


그러나 비트맵으로 변경하여 리사이징 하면 간편하다. 하지만, 이렇게 할 경우 이미징 과정에서 생기는 노이즈와 Depth 단계를 256 단계 밖에 못 쓰므로 풍성한 양감을 얻기 힘들다. 


따라서 DepthFrame[] 을 리사이징 해야 한다. 


방법은 각 배열을 비트맵으로 생각한다음 지정된 가로 사이즈 만큼 나누어 줄을 내린다.


그다음 그 비트맵의 상하좌우 4칸을 잡은 다음 좌측 상단 픽셀만 따로 골라 별도의 배열에 담는다.




(회색부분을 전체 비트맵 이라 생각 했을때 빨간색 픽셀만 골라 낸다) 

 

그러면 계산 상 1/4 배로 사이즈가 줄어 들게 된다.


이 일련의 과정을 간단한 코드로 재현 해 보았다. 


다방면으로 이용 할 수 있는 방법인듯 하다.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;

namespace DepthBitmapFromKinectDepth
{
    class Program
    {
        static int bmpWidth = 320;
        static int bmpHeight = 240;
        static void Main(string[] args)
        {
            Program p = new Program();
        }

        public Program()
        {
            DateTime dt = DateTime.Now;
            //ReadDepthToImage(); - ok
            //ReadDepthFrameToImage(ParseDepthFrame()); - ok
            ResizeQuater();

            Console.WriteLine("process time (ms) > " + (DateTime.Now - dt).Milliseconds);
            Console.ReadKey();
        }
        




        // 사이즈 변경
        // 320 x 240 -> 160 x 120
        private void ResizeQuater()
        {
            var depthframes = ParseDepthFrame();
            var resizeFrmaes = new DATA.DepthFrame[depthframes.Length/4];
            int x = 0, y = 0 , c = 0;
            for (int i = 0; i < depthframes.Length; i++)
            {
                if (i % bmpWidth == 0 && i > 0)
                {
                    ++y;
                    x = 0;
                }

                if (x % 2 == 0)
                {
                    if (y % 2 == 0)
                    {
                        resizeFrmaes[c] = depthframes[i];
                        ++c;
                    }
                }
                ++x;
            }

            Console.WriteLine(x + " " + y + " " + c);
            ReadDepthFrameToImage(resizeFrmaes, new Size(160, 120));
        }





        /// <summary>
        /// 유틸 메서드들 
        /// </summary>
        private byte[] ReadDepthDatFile()
        {
            // 키넥트에서 320 x 240 사이즈의 Depth 이미지의 뎁스 와 플레이어 인덱스를 별토 파일로 저장함.
            // 즉 , 1묶음이 3바이트로 구성되어 있는데 ,[byte : 플레이어 인덱스] [[byte],[] : Short 형 Depth 값 ] 이다. 
            return File.ReadAllBytes(Environment.CurrentDirectory + "/DepthData.dat");
        }

        private DATA.DepthFrame[] ParseDepthFrame()
        {
            byte[] _org_data = ReadDepthDatFile();
            DATA.DepthFrame[] depthFrames = new DATA.DepthFrame[_org_data.Length / 3];

            Console.WriteLine("parse depthFrames : " + depthFrames.Length);

            for (int i = 0; i < _org_data.Length / 3; i++)
            {
                byte playerIndex = _org_data[(3 * i) + 0];
                short depth = BitConverter.ToInt16(_org_data, (3 * i) + 1);

                depthFrames[i] = new DATA.DepthFrame() { PlayerIndex = playerIndex, Depth = depth };
            }

            return depthFrames;
        }

        private void ReadDepthFrameToImage(DATA.DepthFrame[] depthFrames, Size bmpSize)
        {
            int x, y;
            Color[] colors = new Color[bmpSize.Width * bmpSize.Height];
            x = 0;
            y = 0;

            for (int i = 0; i < depthFrames.Length; i++)
            {
                short depth = depthFrames[i].Depth;
                byte depthToByte = (byte)depth;
                colors[i] = Color.FromArgb(depthToByte, depthToByte, depthToByte);

                if (i % bmpSize.Width == 0 && i > 0)
                {
                    ++y;
                    x = 0;
                }
                ++x;
            }

            WriteBitmap(colors, bmpSize, "save2.jpg");
        }

        private void WriteBitmap(Color[] colors, Size bmpSize, string fileName)
        {
            int x, y;
            Bitmap bmp = new Bitmap(bmpSize.Width, bmpSize.Height);
            x = 0;
            y = 0;
            for (int i = 0; i < colors.Length; i++)
            {
                if (i % bmpSize.Width == 0 && i > 0)
                {
                    ++y;
                    x = 0;
                }

                bmp.SetPixel(x, y, colors[i]);
                ++x;
            }
            bmp.Save(Environment.CurrentDirectory + "/" + fileName); // -ok
            Console.WriteLine("write complete");
        }






        /// <summary>
        /// 기본 테스트
        /// </summary>
        private void ReadDepthToImage_Pure()
        {
            int min = int.MaxValue;
            int max = int.MinValue;

            byte[] _org_data = ReadDepthDatFile();

            Color[] colors = new Color[bmpWidth * bmpHeight];
            int x, y;

            //to Depth Image
            x = 0;
            y = 0;
            for (int i = 0; i < _org_data.Length / 3; i++)
            {
                byte playerIndex = _org_data[(3 * i) + 0];
                short depth = BitConverter.ToInt16(_org_data, (3 * i) + 1);

                if (min > depth)
                {
                    min = depth;
                }

                if (max < depth)
                {
                    max = depth;
                }

                byte depthToByte = (byte)depth;
                colors[i] = Color.FromArgb(depthToByte, depthToByte, depthToByte);

                if (i % bmpWidth == 0 && i > 0)
                {
                    ++y;
                    x = 0;
                }
                ++x;
            }

            // 숫자 검증
            Console.WriteLine("min : " + min);
            Console.WriteLine("max : " + max);
            Console.WriteLine("Color len : " + colors.Length);

            Bitmap bmp = new Bitmap(320, 240);
            x = 0;
            y = 0;
            for (int i = 0; i < colors.Length; i++)
            {

                if (i % bmpWidth == 0 && i > 0)
                {
                    ++y;
                    x = 0;
                    Console.WriteLine("Reteral");
                }

                bmp.SetPixel(x, y, colors[i]);

                ++x;
            }
            bmp.Save(Environment.CurrentDirectory + "/Save.jpg"); // -ok 320 x 240
        }
    }

    public class DATA
    {
        public struct DepthFrame
        {
            public byte PlayerIndex;
            public short Depth;
        }
    }
}


Yamecoder 야매코더_
C# 2014. 7. 11. 17:31

댓글을 달아 주세요

[중요 메모] STA Thread 와 COM 객체 사용시 절대 주의 할점

while (true)
            {
                for (i = 0; i < cam.GetCamLength; ++i)
                {
                    camImages[i].Update();
                }

                // COM 객체나 하드웨어 접근을 사용하는 어플리케이션에서는 Join 메서드를 꼭 사용하여야 한다. 안그러면 , 알지못하는 메모리 릭이 발생한다. OS 가 뒤질때 까지...
                rendererThread.Join(1);
            }

COM 객체나 하드웨어 접근을 사용하는 어플리케이션에서는 Join 메서드를 꼭 사용하여야 한다. 안그러면 , 알지못하는 메모리 릭이 발생한다. OS 가 뒤질때 까지...

Yamecoder 야매코더_
C# 2014. 5. 8. 20:54

댓글을 달아 주세요

c# Emgu 카메라 칼리브레이션 요점 정리

요점만..





위의 사진을 사용하여 키보드 [1], [3] 을 번갈아 누르면, 점차 정확한 이미지를 얻을 수 있다.




위의 이미지는 대략 10번 정도 반복한 결과 이다.

원리는 컬리브레이션 결과를 다시 컬리브레이션 하는 반복 과정 이다.



using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CCT_form
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;
        }
        private Size patternSize = new Size(9, 6);
        private Image<Gray, byte> raw_image;
        void Form1_Load(object sender, EventArgs e)
        {
            raw_image = new Image<Gray, byte>(@"C:\temp\ChessBoard-1.jpg");
            this.pictureBox1.Image = raw_image.Bitmap;

            this.KeyUp += Form1_KeyUp;
        }

        private PointF[][] corners = new PointF[1][];
        private void FindChessboard(Image<Gray, byte> org_img)
        {

            Image<Bgr, byte> c_image = org_img.Clone().Convert<Bgr, byte>();
            PointF[] _corners_1 = CameraCalibration.FindChessboardCorners(raw_image, patternSize, Emgu.CV.CvEnum.CALIB_CB_TYPE.ADAPTIVE_THRESH);
            raw_image.FindCornerSubPix(new PointF[1][] { _corners_1 }, new Size(11, 11), new Size(-1, -1), new MCvTermCriteria(30, 0.1));

            for (int i = 0; i < _corners_1.Length; ++i)
            {
                if (i < _corners_1.Length - 1)
                    c_image.Draw(new LineSegment2DF(_corners_1[i], _corners_1[i + 1]), new Bgr(Color.Red), 1);

                c_image.Draw(new CircleF(_corners_1[i], 3), new Bgr(Color.Cyan), 3);
            }

            corners[0] = _corners_1;
            this.pictureBox1.Image = c_image.Bitmap;
        }

        private IntrinsicCameraParameters IC = new IntrinsicCameraParameters();
        private ExtrinsicCameraParameters[] EX_Param;
        private void Calibration()
        {
            MCvPoint3D32f[][] refPoints = new MCvPoint3D32f[1][];//[patternSize.Width * patternSize.Height];
            MCvPoint3D32f[] _refPoints_1 = new MCvPoint3D32f[patternSize.Width * patternSize.Height];

            int c = 0;
            for (int i = 0; i < patternSize.Height; ++i)
            {
                for (int j = 0; j < patternSize.Width; ++j)
                {
                    _refPoints_1[c] = (new MCvPoint3D32f(j * 20.0f, i * 20.0f, 0.0f));
                    ++c;
                }
            }
            refPoints[0] = _refPoints_1;


            double resultValue = CameraCalibration.CalibrateCamera(refPoints, corners, raw_image.Size, IC, Emgu.CV.CvEnum.CALIB_TYPE.CV_CALIB_RATIONAL_MODEL, new MCvTermCriteria(30, 0.1), out EX_Param);
            Console.WriteLine("calib result : " + resultValue);


            Matrix<float> map_x, map_y;
            IC.InitUndistortMap(raw_image.Width, raw_image.Height, out map_x, out map_y);

            Image<Gray, byte> blankImage = raw_image.CopyBlank();
            CvInvoke.cvRemap(raw_image, blankImage, map_x, map_y, 0, new MCvScalar(0));
            raw_image = blankImage.Copy();

            this.pictureBox1.Image = raw_image.Bitmap;
        }

        void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1)
            {
                FindChessboard(raw_image);
            }

            if (e.KeyCode == Keys.D2)
            {

            }

            if (e.KeyCode == Keys.D3)
            {
                Calibration();
            }
        }
    }
}


Yamecoder 야매코더_
C# 2014. 5. 8. 00:49

댓글을 달아 주세요

[Marshal] byte* to byte[]

        protected override void CamStreamStart()
        {
            uint i = 0;
            SNCameraStreamEvent evtarg = new SNCameraStreamEvent();
            while (true)
            {
                for (i = 0; i < cams.Length; ++i)
                {
                    cams[i].m_cameras.RetrieveBuffer(cams[i].m_rawImages);

                    int length = (int)(cams[i].m_rawImages.rows * cams[i].m_rawImages.stride);
                    unsafe
                    {
                        byte[] dstbytes = new byte[length];

                        // [ cams[i].m_rawImages.data ] is [ byte * ] 
                        Marshal.Copy((IntPtr)cams[i].m_rawImages.data, dstbytes, 0 , length);

                        cams[i].m_processedSrc = BitmapSource.Create(
                        (int)cams[i].m_rawImages.cols,
                        (int)cams[i].m_rawImages.rows,
                        96, 96,
                        System.Windows.Media.PixelFormats.Gray8,
                        null,
                        dstbytes,
                        (int)cams[i].m_rawImages.stride);
                        cams[i].m_processedSrc.Freeze();
                    }
                }

                if (CameraEvent != null)
                {
                    evtarg.state = STATE.UPDATE;
                    Application.Current.Dispatcher.Invoke((Action)delegate
                    {
                        CameraEvent(this, evtarg);
                    });
                }

                //Thread.Sleep(1000);
            }
        }

Marshal.Copy 주목.


Yamecoder 야매코더_
C# 2014. 5. 7. 12:32

댓글을 달아 주세요

[WPF] 이미지 byte[] 를 바로 BitmapSource 로 옮기자.

바로  BitmapSource.Create(...)  를 이용하는 방법이다.

이전까지 WriteableBitmap 을 사용하였지만, 이방법이 더욱 간단하고 처리과정에서 이슈도 적다.

 

보통 별도 쓰레드 루프 에서 지속적인 이미지 byte[] 를 얻고 아래의 코드를 활용하여 GUI 에서 처리 한다.


신경을 써야 하는 부분은  간혹   InvalidOperationException   이 발생한다.

try
{
    bsrc = BitmapSource.Create(screenRenderSize.Width, screenRenderSize.Height, 96, 96, PixelFormats.Rgb24, null, W_RawSource_data, REGB24Stride);
    bsrc.Freeze();

}
catch (InvalidOperationException)
{
    return null;
}

또한 원본 데이터의 Stride 선택에 신경을 써 줘야 한다.




참고)

파이어플라이 캠의 FlyCapture2Managedd_v100 중 종속성 오류가 지속될 경우 VisualStudio 2010 을 설치 한다.

아마 그 안에  VC++90 이 설치가 되기 때문일것으로 생각 됨.

Yamecoder 야매코더_
C# 2014. 5. 6. 13:36

댓글을 달아 주세요

[WPF] VisualStudio 에서 [ is not recognized or is not accessible] 에러 해결법


위와 같은 에러메시지.. 아무리 컨트롤들을 잘 잡아도 계속되는 고질적인것은..



 
Here's the solution. In the application's .csproj file, change this:

<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
to this:

<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
Do not be fooled by the fact that Visual Studio reports that you are running in AnyCPU more in the configuration manager. You must hand-edit the .csproj file





하고 한번 빌드해주면 된다. 아니면 F5 하던지..







Yamecoder 야매코더_
C# 2014. 4. 8. 22:07

댓글을 달아 주세요

XmlDocument 사용법 정리


XML 문서

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <attract>
    <time type="bboy" sp="0:0:0" ep="0:0:13"/>
    <time type="km" sp="0:0:13" ep="0:0:32"/>
    <time type="bboy" sp="0:0:32" ep="0:0:55"/>
    <time type="magic" sp="0:0:55" ep="0:1:27"/>
    <time type="pid" sp="0:1:27" ep="0:1:40"/>
    <time type="km" sp="0:1:40" ep="0:1:55"/>
    <time type="bboy" sp="0:1:55" ep="0:2:13"/>
    <time type="km" sp="0:2:13" ep="0:2:36"/>
    <time type="magic" sp="0:2:36" ep="0:3:00"/>
    <time type="pid" sp="0:3:00" ep="0:3:19"/>
  </attract>
</root>



c#

attractTimeTable = new List<KBVideoItem>();
            XmlDocument xml = new XmlDocument();
            xml.Load(Environment.CurrentDirectory + "/config/KBVideoTimeTable.xml");


            XmlNodeList _attract_list = xml.SelectNodes("/root/attract/time");
            Console.WriteLine(_attract_list.Count);
            foreach (XmlNode xn in _attract_list)
            {
                Console.WriteLine("----------------------------");
                Console.WriteLine(xn.Attributes["type"].InnerText);
                Console.WriteLine(xn.Attributes["sp"].InnerText);
                Console.WriteLine(xn.Attributes["ep"].InnerText);
            }



Yamecoder 야매코더_
C# 2013. 11. 28. 10:46

댓글을 달아 주세요

WPF , CacheMode

CacheMode 의 사용과 비 사용의 테스트 이다.

 

테스트 방법은 사진 640 , 480 ,사이즈의 이미지 플레이트 들을 60장 생성하고 이를 겹겹이 겹쳐 놓은 다음 최상단 플레이트를 크게 움직였다.

 

첫번째는 캐쉬를 설정하지 않은 경우 이다.

 

 

FPS 가 6 정도 나왔다.

거의 사용이 불가능 하다.

 

 

다음은 캐쉬를 설정한 경우이다.

 

 

캐쉬 적용 시점은 이미지의 로드가  완료 된 후 이미지 플레이트 전체에 설정 하였다.

 

 

참고 :

선택할경우 테두리의 알파값이 변하는 애니메이션이 존재한다.

FPS 수치는 절대적인 수치가 아니라 상대적으로 이해 하는것이 맞다.

테스트 PC 사양 : i5 3세대 (1.7 ~ 2.4)Ghz , 4G RAM , Intel HD 4000 (노트북)

 

 

결론 :

비주얼에 캐쉬를 설정하는것은 비주얼을 일종의 비트맵 블리팅 시키는것이다. 또한 필요한 부분만 다시 렌더링 한다.

아마 큰 비주얼 수정이나 재 로딩 이 있을 경우 다시 설정하여여 할것으로 예상된다.

퍼포먼스는 상당이 만족 스럽다.

Yamecoder 야매코더_
C# 2013. 1. 28. 00:28

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. BlogIcon christian louboutin outlet 2013.03.31 07:21  수정/삭제  댓글쓰기

    만 사람들이 물건을 빠르게하는 방법을 알고 중지하는 방법을 알고.

  3. BlogIcon supra vaider 2013.04.01 19:37  수정/삭제  댓글쓰기

    내 마음조차도 사랑 앞에서는 내 뜻대로 안돼

  4. BlogIcon Michael Kors outlet 2013.04.01 20:45  수정/삭제  댓글쓰기

    언젠가부터 그댈 보면 내 마음을 들킬 것만 같아서

  5. BlogIcon nike shox sko 2013.04.01 21:00  수정/삭제  댓글쓰기

    결국 올려다 본 젖어 있는 하늘눈물 닦을것은 차가운 내 손등 이젠 편해졌어 미워할수 있으니

  6. BlogIcon nike free run 2013.04.01 21:13  수정/삭제  댓글쓰기

    내 가슴에게 미안해리아하늘이시여

  7. BlogIcon christian louboutin outlet 2013.04.01 23:02  수정/삭제  댓글쓰기

    미안 미안내가슴아좀 아플꺼야잠시 뿐일꺼야

  8. BlogIcon nike free 2013.04.02 01:05  수정/삭제  댓글쓰기

    잠시 스쳐가는 인연이길 바랬어

  9. BlogIcon christian louboutin outlet 2013.04.02 01:39  수정/삭제  댓글쓰기

    숨겨왔던 나의 수줍은 마음 모두 네게 줄게 예이예

  10. BlogIcon ghd nz sale 2013.04.02 02:00  수정/삭제  댓글쓰기

    내 마음조차도 사랑 앞에서는 내 뜻대로 안돼

  11. BlogIcon burberry store 2013.04.02 04:54  수정/삭제  댓글쓰기

    내 마음조차도 사랑 앞에서는 내 뜻대로 안돼

  12. BlogIcon chaussures louboutin 2013.04.02 05:43  수정/삭제  댓글쓰기

    결국 올려다 본 젖어 있는 하늘눈물 닦을것은 차가운 내 손등 이젠 편해졌어 미워할수 있으니

  13. BlogIcon abercrombie london 2013.04.03 21:49  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아.

  14. BlogIcon toms on sale 2013.04.07 03:33  수정/삭제  댓글쓰기

    헤여졌다한들 슬퍼하지마. 이후에 만나게될 더좋은 사람을 위해 항상 웃는얼굴 잃지 말자.

  15. BlogIcon christian louboutin heels 2013.04.08 03:46  수정/삭제  댓글쓰기

    아무리 절망적 문제는, 오래 결국 일을 주장 할 용기가로 희망을 갖게됩니다.

  16. BlogIcon sac longchamp solde 2013.04.10 03:07  수정/삭제  댓글쓰기

    긴장하지 말고 침착하게 자신의 실력을 발휘하면 될것이다!

  17. BlogIcon cheap oakley sunglasses 2013.04.10 05:04  수정/삭제  댓글쓰기

    당신은 내가 만나는 가장 아름다운 풍경입니다.

  18. BlogIcon christian louboutin shoes 2013.04.10 20:13  수정/삭제  댓글쓰기

    노동과 수확 기대의 기쁨을 느낄 어려운 내부의 삶의 선하심을 생각 전심 보통 일 매일 생활을 수확 보자.

  19. BlogIcon christian louboutin outlet 2013.04.10 22:04  수정/삭제  댓글쓰기

    행운 만이 개인 능력 당신이 일생 동안 도와 드릴까요 평생 할 수 없습니다 않습니다.

  20. BlogIcon longchamps 2013.04.14 01:50  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아, http://ntu.buybluetree.com/ louis vuitton scarf.

  21. BlogIcon cheap oakley sunglasses 2013.04.23 19:51  수정/삭제  댓글쓰기

    창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

[Surface2]Surface2.0 Simmulator on Windows8 , Solved!

 

 

윈도우8 에서 Surface SDK 가 설치되지 않는다.

하지만 dll 만 있다면 개발은 할수 있다.

 

그러나 시뮬레이터는 사용할수가 없어 완전한 개발을할수 없었다.

그러던 어느날 , 설치가 되었다. 어떻게 되었는지는 확실치 않으나

실제 경로 C:\Program Files (x86)\Microsoft SDKs\Surface\v2.0 에 정확히 파일이 있고 ,

C:\Program Files (x86)\Microsoft SDKs\Surface\v2.0\Tools 에도 모든 유틸리티가 존재 한다.

아마도 그냥 한번 윈도우7 의 것을 그대로 복사를 했나 보다.

 

 

지원 하지 않는다는 글 ,

http://social.technet.microsoft.com/Forums/et-EE/surfacesoftware2/thread/c9439b5b-44a9-4643-910a-2eb4d2a62d35

 

 

Yamecoder 야매코더_
C# 2013. 1. 25. 22:35

댓글을 달아 주세요

  1. BlogIcon Tory Burch store 2013.03.21 18:44  수정/삭제  댓글쓰기

    부모를 공경하는 효행은 쉬우나,부모를 사랑하는 효행은 어렵다..

  2. BlogIcon pandora online 2013.04.24 20:36  수정/삭제  댓글쓰기

    사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요

  3. BlogIcon Chicago Blackhawks Jersey 2013.07.15 09:45  수정/삭제  댓글쓰기

    지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼

[Surface - WPF] Surface 에서의 에니메이션 활용 (ArtefactAnimator)

 

출처 : http://artefactanimator.codeplex.com/

 

기존 WPF 의 애니메이션 중 스토리 보드(Storyboard) 라는 극악의 사용성을 가진 방법이 존재 한다.

AS3 의 트윈라이트 (TweenLite , TweenMax) 처럼 산뜻하지 않고 왠만한 복합에니메이션을 구현하려면 한바닥이 꽉 찬다.

이건 , 머 차라리 자체적으로 트윈 클래스를 만들라는 숨은 의도 같다.

그러던 도중 artefactanimator 라는 것을 발견했고 이것이 AS3 의 TweenLite 를 본따서 만들었다고 한다.

사용법이 간단하다.

그러나 보통의 UIElement 에서는 잘 동작 하나 , Surface2.0 용 컨트롤 에서는 당췌 동작하지 않는다.

이유를 살펴 보니 각 속성이 getter setter 로 잘 지켜져야 한다. 마땅하다. 그러나 AS3 의 비주얼 객체들과 달리 WPF 의 객체들의 비주얼 속성 을 살펴 보면 간단히 getter setter 로 잘 되어 있지 않은것이 많다.

대표적인것이 ScatterViewItem 의 위치 를 설정할때 item.Center = new point(*.*) 식으로 설정 해야 한다.

이러한 형태로 트위닝은 보통 방법으로는 어렵다.

AS3 의 TweenMax 류 에서는 별도의 var obj = {prop : 100} 로 설정한다음 obj 에 Tween을 걸었다. 이와 비슷한 방법으로 artefactanimator 를 활용하는 방법을 알아본다.

 

 
//트위너 설정
            var customTween = new GetterSetter
            {
                Getter = (obj, data) => obj,
                Setter = (obj, data, per) =>
                {
                    //변위
                    var c = EaseHelper.EaseValue((Point)data.ValueStart, (Point)data.ValueEnd, per);

                    //트위닝 타겟
                    item.Center = c;
                }
            };

            //초기객체 설정
            Point movePoint = new Point(0, 0);

            //Prop 레지스터 등록 , 같은 이름으로 등록을 시도하면 등록이 안된다. 따라서 밑에 것은 무시되어 걱정할필요 없다.
            var b1 = AnimationTypes.RegisterGetterSetter(movePoint.GetType().ToString(), customTween);
            var b2 = AnimationTypes.RegisterGetterSetter(movePoint.GetType().ToString(), customTween);
            Console.WriteLine("b1 " + b1);
            Console.WriteLine("b2 " + b2);

            //실제 트위닝 명령
            ArtefactAnimator.AddEase(movePoint, movePoint.GetType().ToString(), new Point(323, 211), 3, AnimationTransitions.CubicEaseIn);

            //5초 후에 다시 트위닝
            movePoint.X = 323;
            movePoint.Y = 211;
            ArtefactAnimator.AddEase(movePoint, movePoint.GetType().ToString(), new Point(323, 0), 3, AnimationTransitions.CubicEaseIn, 5);

 

 

Yamecoder 야매코더_
C# 2013. 1. 22. 15:45

댓글을 달아 주세요

  1. BlogIcon pandora bracelet 2013.03.21 18:44  수정/삭제  댓글쓰기

    가장 높은 곳에 올라가려면, 가장 낮은 곳부터 시작하라.

  2. BlogIcon nike sko 2013.04.05 15:44  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아.

  3. BlogIcon sacoche longchamp 2013.04.07 00:08  수정/삭제  댓글쓰기

    한세계를 놓고 말하면 당신은 한 사람이지만,단 한사람을 놓고 말하면 당신은 그라삼의 세계입니다

  4. BlogIcon cheap toms shoes 2013.04.08 00:04  수정/삭제  댓글쓰기

    아무리 절망적 문제는, 오래 결국 일을 주장 할 용기가로 희망을 갖게됩니다.

  5. BlogIcon cheap nhl jerseys 2015.02.07 23:58  수정/삭제  댓글쓰기

    뉴법West Virginia Mountaineers Jerseys wholesale jerseys New York Nets jerseys


    ,Jerseys,Custom Authentic College Football Jerseys











    It will be centered on what the Colts did to put themselves in that big hole against Peyton Manning and the Broncos,Detroit Lions Hats,Michael Crabtree Jersey Texas Tech,Boston Red Sox Jerseys.없마

[.NET] 어셈블리 하나로 합치기 (ilmerge 사용안함)

 

코딩을 하다보면 dll 들이 엄청 늘어 날때가 있다.

폴더가 지저분해진다.

보기 않좋다.

 

그래서 모든 dll 을 Embed 시키는 방법을 알아 본다.

기존의 ilmerge 라는 툴이 있지만 WPF 등과 같은 프레임웤에 사용하려면 관련된 dll 을 다 열거 하라고 하고 사용법 또한 그리 스마트 하지 않다.

AppDomain.CurrentDomain.AssemblyResolve 를 이용하여 하나로 합칠수가 있다.

우선 사용될 모든 dll 을 비주얼 스튜디오 안으로 끌어 온다

 

.

 

그다음 이 모든 dll 들을 포함 리소스로 만들어 준다.

 

그리고 App 클래스로 이동하여 아래와 같이 코딩 한다.

 

 

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;

namespace Test_Marge
{
    public partial class App : Application
    {
        public App()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
        }

        static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            //We dont' care about System Assembies and so on...
            //if (!args.Name.ToLower().StartsWith("Test")) return null;

            Assembly thisAssembly = Assembly.GetExecutingAssembly();

            //Get the Name of the AssemblyFile
            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

            //Load form Embedded Resources - This Function is not called if the Assembly is in the Application Folder
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Count() > 0)
            {
                var resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null) return null;
                    var block = new byte[stream.Length];
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
            }
            return null;
        }
    }
}

 

 

그리고 난 다음 빌드된 폴더의 exe 만 따로 꺼내어 테스트 해본다.

 

 

출처 : http://blog.mahop.net/post/Merge-WPF-Assemblies.aspx

 

 

참고 : Winform 에서는 Program.cs 의 Application.Run(new Form1()); 위에 작성한다.

Yamecoder 야매코더_
C# 2013. 1. 16. 16:18

댓글을 달아 주세요

  1. BlogIcon ghd retailers nz 2013.03.21 18:44  수정/삭제  댓글쓰기

    인생의 목적은 끊임없는 전진에 있다.

  2. BlogIcon toms shoes outlet 2013.04.10 08:22  수정/삭제  댓글쓰기

    눈에 눈물이 없으면 영혼에 무지개가 없을 것이다. 

  3. BlogIcon gafas carrera 2013.04.11 17:33  수정/삭제  댓글쓰기

    다른 사람에서 다른 사람의 정신적 활동을 이해하고, 사물을 보는 개념은 자신의 미래에 대해 전혀 걱정할 필요가 없습니다.

  4. BlogIcon toms shoes 2013.04.11 19:07  수정/삭제  댓글쓰기

    우리가 어디에 있는가가 중요한 것이 아니라 어디로 가야 하느냐가 중요한것이다

  5. BlogIcon ralph lauren sale 2013.04.24 15:22  수정/삭제  댓글쓰기

    당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.

  6. BlogIcon 匿名 2013.11.28 12:55  수정/삭제  댓글쓰기

    는할 ◣彩钢全自动压瓦机的特点

    彩钢压瓦机分为半自动和全自动之分。 半自动压瓦机只有压型部分,即压型主机。它工作的时候需要借助于剪板机配套使用。由于半自动压瓦机没有自动剪切部分,即主机只能压出瓦型,却不能切割。剪切的时候可使用脚踏小剪板机或者液压剪板机进行剪切。但是生产速度慢,而且耗费人力资源。根据人们的生产需要,现在研制出全自动数控压瓦机
    一种新型全自动压瓦机,该机使用方便,生产速度快,每分钟可压出成型板型8-10米。该全自动彩钢压瓦机都装有剪切装置、电脑数控系统和计数器。您压板过程中只需在数控系统上设置好一次性您需要出板的长度即可,,彩钢角驰压瓦机
    该剪切装置会自动在压出板型后,根据您设定的压板长度自动剪切,而且计数器会自动记录压板数量。还有一个好处就是可以减少操作人员的数量,只需1-2人,就可以每天达到4800米/天。机械厂
    可大大提高了生产速度和工作效지니

[WPF] 트레이 아이콘 만들고 사용하기

 

트레이 아이콘을 만들고 , 무언가 알림이 있을때 풍선메시지를 만들어 본다.

먼저 간단히 아이콘을 만들어 리소스에 넣어 본다.

* [프로젝트 속성] - 리소스 - 리소스추가 - 아이콘 추가

를 하면 기본 아이콘이 생성된다.

이를

Properties.Resources.Icon1;

로 접근 할수 있다.

 

사용법은 아래와 같다.

 
private System.Windows.Forms.NotifyIcon trayIcon;
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            //make up tray icon
            trayIcon = new System.Windows.Forms.NotifyIcon();
            trayIcon.BalloonTipText = "this app has been minimised";
            trayIcon.BalloonTipTitle = "BalloonTipTitle";
            trayIcon.Text = "Text";
            trayIcon.Icon = Properties.Resources.Icon1;
            trayIcon.Click += m_notifyIcon_Click;

            //make up test timer.
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = new TimeSpan(0, 0, 2);
            timer.Tick += timer_Tick;
            timer.Start();
        }


        private int c = 0;
        void timer_Tick(object sender, EventArgs e)
        {
            //if you want alert something , use this method. and change Text
            trayIcon.ShowBalloonTip(1000);
            trayIcon.BalloonTipTitle = "count " + c;
            trayIcon.BalloonTipText = "alert test";
            ++c;
        }

        void m_notifyIcon_Click(object sender, EventArgs e)
        {
            Show();
            //restore window state
            WindowState = System.Windows.WindowState.Normal;
        }

        
        private void Window_IsVisibleChanged_1(object sender, DependencyPropertyChangedEventArgs e)
        {
            // when window is unvisible , change visible option tray icon .
            if (IsVisible == false)
                trayIcon.Visible = true;
        }

        private void Window_StateChanged_1(object sender, EventArgs e)
        {
            if (WindowState == System.Windows.WindowState.Minimized)
            {
                Hide();
                trayIcon.ShowBalloonTip(2000);
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosed(e);
            //when user click The [Close button] , this app will not work window close command.
            //instead , this app window change to minimized state. 
            WindowState = System.Windows.WindowState.Minimized;
            e.Cancel = true;
        }

Yamecoder 야매코더_
C# 2013. 1. 16. 13:29

댓글을 달아 주세요

  1. BlogIcon Tory Burch Flats 2013.03.21 18:44  수정/삭제  댓글쓰기

    행복을 졸겨야 할 시간은 지금이다. 행복을 즐겨야 할 장소는 여기다.

  2. BlogIcon toms shoes sale 2013.04.02 05:14  수정/삭제  댓글쓰기

    아름다운 여자가 해바라기하는 걸 좋아해요

  3. BlogIcon christian louboutin shoes 2013.04.03 04:31  수정/삭제  댓글쓰기

    아름다운 여자가 해바라기하는 걸 좋아해요

  4. BlogIcon ralph lauren shoes 2013.04.24 13:17  수정/삭제  댓글쓰기

    태양이 바다에 미광을 비추면,나는 너를 생각한다.

  5. BlogIcon nike shoes 2013.07.13 15:40  수정/삭제  댓글쓰기

    다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

  6. BlogIcon 匿名 2013.11.26 05:39  수정/삭제  댓글쓰기

    버마Your ISP shut your services down even if you are running opt-in email lists because of some complaints from some users that forget they were opted in? Then our overseas BP (bullet proof) web hosting services are your choice. We will help you on getting a stable web hosting and make money with ease.


    Your ISP shut your services down even if you are running opt-in email lists because of some com어리

[WPF] 윈도우 닫기 명령 무시하기

 

윈도우 유틸 어플리케이션을 만들경우 윈도우 닫기를 눌러도 무시해야 하는 경우가 생긴다.

닫이면 안된다는것이다.

WIN32 를 건드리지 않고서라도 간단히 해결할수 있는 방법이 있다.

 

protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosed(e);
            //do something
            //WindowState = System.Windows.WindowState.Minimized;
            e.Cancel = true;
        }
 

OnClosing을 오버라이드 하면 된다.

 

 

Yamecoder 야매코더_
C# 2013. 1. 16. 12:37

댓글을 달아 주세요

  1. BlogIcon tory burch outlet online 2013.03.21 18:44  수정/삭제  댓글쓰기

    말도 아름다운 꽃처럼 그 색깔을 지니고 있다.

  2. BlogIcon sac longchamp 2013.04.14 02:15  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아, http://ntu.contact-hotel.com/cl.php christian louboutin.

  3. BlogIcon nike air max 2013.07.14 01:39  수정/삭제  댓글쓰기

    사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요

  4. BlogIcon ボッテガ ヴェネタ 人気新作 2013.10.23 22:51  수정/삭제  댓글쓰기

    할분ガガミラノ 人気 ランキング 偽物?全世界人民用生命 和鲜血赢得了反法西斯战争的胜利,ロレックス,ロレックス 人気 ランキング 偽物,雨燕黄帝内经.
    オフィチーネ・パネライ人気表の推薦:オフィチーネ・パネライ111、オフィチーネ・パネライ183、オフィチーネ・パネライ000、オフィチーネ・パネライ233、オフィチーネ・パネライ380、オフィチーネ・パネライ320、オフィチーネ・パネライ127、オフィチーネ・パネライ112、オフィチーネ・パネライ104、オフィチーネ・パネライ360、オフィチーネ・パネライ164、オフィチーネ・パネライ176 オフィチーネ・パネライ公式サイト: 聊城開発区鑫豪管業製造有限会社の主要な生産:ボックス、矩形管、シームレスボックス、Q345Bシームレスボックス、方矩形管などさまざまなボックス規格表ボックス理論重量表.王府井百貨の関係者は.普通はすべて数の精鋭モ리리

  5. BlogIcon nike air 2013.11.20 13:17  수정/삭제  댓글쓰기

    단방Hollister tænke på det som california ved hjælp af columbus

    Disse slacks fremstilles ved en overlegen opfylder dette slankere tallet og tillader comfy linning er bevægelig ud over brugerne. Disse former for bukser søge stor, da de føler. Der er en anden stil i kok ben beskyttelse tilgængelige. Stop i dette område for at nyde en storslået udsigt over Honeoye Lake i dalen. En bænk er tilgængelig 일리

  6. 匿名 2015.01.14 18:28  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

[asmx] 쿠키 이용하기 , (사용자 인증)

서버측 코드

 

 
[WebMethod]
        public string LoginService(string _userId , string pw)
        {
            var query = from user in db.DbAccounts.Accounts
                        where (user.User_id == _userId)
                        select user;


            if (query.Count() > 0)
            {
                //success
                HttpContext.Current.Response.Cookies["User_id"].Value = _userId;
                //HttpContext.Current.Response.Cookies["User_id"].Expires = DateTime.Now.AddMinutes(10);
                return "ok";
            }
            else
            {
                //fail
                return "fail";
            }
        }

로그인을 하여 아이디가 검출 되면 쿠키를 발행 한다.

밑에 주석 되어 있는 코드는 쿠키의 유효 시간이다.

 

 

클라이언트 측 코드

 

 
private static void loginTest()
        {
            Login.LoginSoapClient service = new Login.LoginSoapClient();

            var result = service.LoginService("testid", "testpw");
            Console.WriteLine(result);

            int c = 0;
            while(c < 300)
            {
                try
                {
                    Console.WriteLine(c + " " + service.dosomething());
                }
                catch (Exception eee)
                {
                    Console.WriteLine("cookieErr");
                    //Console.WriteLine(eee);
                }
                Thread.Sleep(1000);
                ++c;
            }

 

로그인 서비스를 호출한뒤 , 쿠키가 유효한지 검사한다.

하지만 아무리 해도 안될것이다. 이유는 클라이언트 어플리케이션 에서 쿠키 설정을 해줘야 한다.

app.config

 

위와 같이 설정해주면 된다.

 

Yamecoder 야매코더_
C# 2013. 1. 15. 17:25

댓글을 달아 주세요

  1. BlogIcon Yamecoder 야매코더_ 2013.02.28 11:22 신고  수정/삭제  댓글쓰기


    서버측 dosomething() 메서드

    [WebMethod]
    public string dosomething()
    {
    //User.Identity.IsAuthenticated

    //매 클래스 생성자에다가 쿠키 유효를 판단하여 유효하지 않다면 exception
    return HttpContext.Current.Request.Cookies["User_id"].Value; //.Cookies["testcook"].Value;
    }

  2. BlogIcon longchamp bags 2013.04.07 23:36  수정/삭제  댓글쓰기

    인연은 우연히 찾아오고 사랑은 조심스럽게, 몰래 찾아온다.

  3. BlogIcon oakley sunglasses 2013.04.23 14:43  수정/삭제  댓글쓰기

    당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

  4. BlogIcon pandora charms 2013.04.25 12:33  수정/삭제  댓글쓰기

    창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.

  5. BlogIcon nike zoom kd v shoe 2013.05.28 18:37  수정/삭제  댓글쓰기

    ++++++++++++++++++++++++++++++++
    欢迎光临txt小说之家
    www.915c.com
    所有小说解压密码为www.915c.com
    上万部txt格式小说免费下。
    ++++++++++++++++++++++++++++++++大粪要紧

      几个早起积肥的知青各挑着一担大粪匆匆地走着。忽然走在头里那人不慎滑倒。担着的东西泼洒一地。几个同伴赶紧放下担子, 上前去正要扶他起来。   跌倒者奋力挣开同伴的搀扶,手指着正满地流淌的那物,慷慨激昂、铿锵有力 地说道:   “同志们,不要管我,抢救公社的大粪要紧!”


    文革文物——书信原件照抄

    北京红旗证章厂的无产阶级革命造反派战友们和老师付:
      您们好!
      首先,让我们共同敬祝我们心中最红最红的红太阳毛主席万寿无疆!万寿无疆 !!万寿无疆!!!
    祝愿我们的林付主席永远健康!永远健康!!
      在伟大的领袖、伟大的导师、伟大的舵手毛主席为首,林付主席为付的党中央 和我们哀心爱戴和拥护的江青同志亲自领导的中央文革的英明正确领导下,我省、 我地区、我县和本单位的革命形势一派大好,不是小好,正在和全国一样天下大乱 ,乱了敌人,正如伟大导师毛主席教导我们的:“人民群众真正发动起来了”。
      北京是社会主义祖国的首都,革命人民的心脏,无产者的圣地,世界革命的中 心和大后方,人民想忘的地方,您们在毛主席身边,在以伟大的领袖、伟大的导师 、伟大的舵手毛主席为首,林付主席为付的党中央身边革命,工作,学习,多么无 限的幸福!光荣!
      造反方知主席亲!我们无产阶级革命造反派的红心是联在一起的!今日写信非为别事,只是要请三个金光闪闪无限的毛主席大像章。我们需要请最大的,有冬梅或者军舰(梅花欢喜漫天雪或者大海航行)的红宝章,有有天安门的也可以基本上满足我们的哀心希望。由于刘少狗和他在福建的代理人(现在已被广大人民群众打 翻在地并踏上千万只脚,永世不得翻身)的破坏,我们在本地区目前请不到大的红 宝章,只有小的。
      附上壹元整是请红宝章的费用,如果有欠,通知后再寄去,如果有多,切勿寄来,留下作革命的经费。
      最后让我们共同高呼伟大的领袖毛主席万岁!万岁!!万万岁!!!
      此致   无产阶级文化大革命造反派战友的红色革命布礼!
                     福建宁化农工机傲霜雪战斗队
                     革命战士              严×× 赵×× 黄×× 一九六七年三月二十九日


    样板戏《列宁在十月》

      那些年除了演样板戏,也演过一些新编的现代戏。印象最深刻的是《列宁在十 月》。
      此戏据说无剧本,全凭着旧戏曲的八大韵去“踩水”(即兴创作)大剧团不敢 演,怕犯错误,只有些班子小胆子大的县川剧团才敢演它。演列宁的须生崔正红习 惯了在台上走正步,举手投足依然是旧戏中的大臣风范。花脸刘盛财演斯大林,在 台上老是用手死劲捻松香粘的八字胡。我同其它演员串角,端端正正站在二位革命 导师旁聆听教悔。
      列宁唱:【红鸾袄·二流板】
       叫一声约瑟夫孤的好兄弟
       有件事朕同你细说端的
      打冬宫咱还要从长计议
        切不可闹意气误了战机
        冬宫内到处有许多裸体
        全都是大理石雕刻成的
      斯大林唱:(同上曲牌)
        嗔一声敬爱的……(帮腔)弗拉基米尔·依里奇
         三日前本将军已传话下去
        打冬宫不准毁坏文物古迹
        开枪不能朝着壁上的裸体
        那都是尼古拉留给咱们无产阶级的     

    ………………… (摘自小说《落花时节》。作者何洁,诗人流沙河之妻)

     

    公有制

    在某个公社,正在批斗一位教师,突然上来一位
    女人,大家认识正是这位教师的妻子,她和革委会的头的
    不正当关系早已不是什么秘密,只听她指控道,"...,他
    长期反对毛主席,反对党,而且,把我当成他的私有财产
    ..",大家一听就知道这出于那位头的授意,想为教师说
    句话苦于没有什么合适的借口.
    只见有位学生跳上台来,"在社会主义的中国,怎么
    能允许这种事情发生呢?!你一定老老实实坦白,老老实实
    改造,怎么能把你妻子当成你的私有财产呢!?",
    "一定要把她当成公有财产!"

    一群老婆
      某老农,目不识丁,耳朵又背。听罢关于“九·一三”林彪事件的传达,回家对老婆说:“林秃子想害毛主席,没得手,开上飞机往苏联跑。那驴不日的不是东 西,临走时还把马克思的皮大衣给偷走了,又带着老婆一大群,结果没跑掉,把三 叉骨给跌断了。”


    批林批孔大会

      某单位召开批林批孔大会,台上一男高音与一女高音正领着全场的人喊口号:
        (领)打倒林彪!
       (众)打倒林彪!
       (领)打倒孔老二!
       (众)打倒孔老二!
       (领)狠批克己复礼!
       (众)狠批克己复礼!     ……
      口号呼毕,正要在领导发言前,会场出现短暂的宁静。就在这时传达室的老张 匆匆跑到后台来,对坐在大会主席台的领导大叫:“王主任有电话!”
      于是乎全场革命群众一起跟着振臂高呼:
      “王主任有电话!”


    批斗老爸

      文革时常开批斗会,一次某人老爸被抓上台批判。大会结束时有人要他高呼口 号与其父决裂划清界线,只见他冲到台前振背高喊:“打倒我爹!打倒我爹!”
      这时众人也跟着齐呼:“打倒我爹!打倒我爹!”


    县委书记做报告

      大约是71年,渭南县新提拔的县委书记在全县三级干部会上做报告,讲话稿 事先以由秘书写就在县委专用稿纸上。这种稿纸照例有“渭南县委专用稿纸”几个 红字印在每页顶端,书记也就一字不拉照念,所以每隔几分钟就有“渭南县委专用 稿纸”几个字莫名其妙的插进来。听众开始摸不着头脑,后来就知道是怎么回事了 。大家都憋住气,静静的等待那几个字从书记嘴里冒出来,接下去是一阵哄笑,然 后平静下来,等待下一个高潮的出现。书记全然不觉,直到秘书走上前去小声告知 那些红字是不需要念的。书记坦然一笑说:“我还思谋着红字儿是最要紧的呢,再 说念一下也没啥关系么。”


    咸菜与酱瓜

      一个口音很重的县长到村里作报告:
      “兔子们,虾米们!不要酱瓜,咸菜太贵啦!!”(注:同志们,乡民们!不 要讲话,现在开会啦!!)
      县长讲完以后,主持人说:
      “咸菜请香肠酱瓜!”(注:现在请乡长讲话!)
      乡长说:
      “兔子们,今天的饭狗吃了,大家都是大王八!”(注:同志们,今天的饭够 吃了,大家都使大碗吧!”)

     

    茅坑门联

      记得家乡露天茅坑也有门联横批,老夫子的卵儿——文皱皱的。姑录二则以博 一笑:
      其一:     天下英雄豪杰 到此低头屈膝     世间贞女节妇 进来解带宽裙   横批:天地正气
      其二:     屎落塘中 震动满天星斗 (注:晚上是星星,白天是苍蝇)   尿淋壁上 展开万里江山  横批:气冲斗牛

     

    知青书信

      毛爷爷时代年青人不好好读书,写信回家时多有别字,闹出很多笑话。
      一女知青到边远山区插队落户,写信回家说:亲爱的爸爸,自从和贫下中农打 成一片以来,我已经愈混愈熟,晚上就和老大狼(娘)睡一个坑(炕),现在我的 肚(胆)子也越来越大了……
      弟弟回信:家里一切都好,不用担心,妈妈上吊(调)了……


    家庭出身

      毛爷爷时代,人走在街上随时都会被揪出来唱语录歌,问家庭出身,个人成分 等,所以搞得人人都特紧张。
      话说这哥们病了,去看医生。张过嘴,开过方子,让打针。
      走进护士室,一年青女护士让他做好准备姿势。那时蔡伦还没发明牛仔裤,所 以特容易发生事故。那哥们一不小心,裤子掉地上了。    护士以为他耍流氓,大怒,喝道:“畜牲!”
      那哥们吓一跳,马上立正,答道:“贫农!”
      护士一听,没有好气,骂道:“二流子!”
      那哥们连忙答道:“二舅子也是贫农!”


    兄弟吵嘴

      兄弟俩吵嘴,弟弟骂道:“你妈*”,哥哥回骂:“你妈*!”。
      爸爸怒着冲过来,打了每人一个耳光,训斥道:“吵什么,他妈不是你妈?你奶奶的!”


    “万寿无疆”和“永远健康”

      一老农学会了几句革命口号,总想在人面前卖弄卖弄。
      一日老农拎着一大一小两兔子去集上卖。有人上前问:“你这兔子不是病兔吧 ?”
    老农急忙答道:“您放心,俺这俩兔子,一只是万寿无疆,一只是永远健康! ”


    春 耕 忙

    某知青点,插队者是一批音乐学院学生,平时不闻丝弦声. 忽一日,公社组织
    宣传队,广大贫下中农对 "再教育" 对象表示信任,派他们登台表演.
    幕启,英姿飒爽的报幕员道: "下一个节目,小提琴合奏《贝多芬想念红太阳》
    全场掌声雷动. 贝多芬既然想念红太阳,准是个无产阶级革命派. 音乐学院学生
    们堂而皇之演奏一段老贝的《 F大调浪漫曲》.
    继而,准备演奏比才的《斗牛士之歌》.
    报幕员介绍说: "下一个节目,《全世界贫下中农春耕忙》" .


    《智取威虎山》

      杨子荣同志打虎上山,在威虎厅和俺们山爷叫劲,比着打吊灯。山爷一枪打灭 一盏油灯,众匪徒叫道,好!好!俺们杨子荣同志震臂一甩,一枪打灭两盏灯,众 匪徒又叫道,好,一枪打俩。
      有一回,一地区文工团演出《智取威虎山》俺们山爷一枪出去,道具一不小心 ,关了两盏灯,众匪徒叫道:好哇,一枪打俩。
      道具同志一听,心说不好,这可咋个办法呐?俺们英雄人物可不能输给个座山 雕,这可是个原则问题,等到子荣同志震臂一甩时,把个总电闸给关了。
      众匪徒也不含糊,齐嚷道:好哇,一枪把保险丝都打断了。

     

    《智取威虎山》(其二)

      大剧团演《智取威虎山》关电门,有电。在县里演没电,用砸炮。
      有一次杨子荣枪毙栾平,唱完那段“快板”后举枪就打。后面铆足了劲砸下去 ,臭炮。
      前面不愧是大智大勇的子荣同志。他又说了一句:“我代表人民。”又一挥枪 ,没响。急了,“我代表党”,还是没声。总不能这么老耗着呀,栾平的后脖子提 着都快给勒死了。子荣一脚把栾副官踢了下去,骂了一声“去你妈的”, http://www.asicstrainningshoes.com/ Women's Trainning Shoes,转身插枪 入腰间。后台忙活了半天总算忙顺溜了,看也没看,梆的就是一下,这次响了。正 打在子荣的命根子上面。

     

    照相

      一哥们进城上照相馆去照相。
      “同志,给俺照个模样。”
      “要几寸的?”
      “怎么还要布票?!”
      “是问你要多大个的!”
      “来它一块钱儿的!”


    照相(其二)

      话说文革那会儿,农村还不富裕,老农民进一趟城就象咱现在出一趟国,虽说 来去自由,可没钱常来常往啊。一天,一老哥们头一回进照相馆想照一张相:
      老农民:同志!俺想捏一个影儿。
      女服务员:行啊,几寸的?
      老农民:这个……您给来五毛钱的吧!
      女服务员:五毛钱?你要光的还是要麻的?(注:即光面相纸还是麻面相纸)
      老农民:这个……,嘿嘿!实话跟您说吧,除了下河洗澡和上炕睡觉俺至少得 穿个裤头不是?这样吧!俺来个半光的行不?

     

    取得联系

      想起一哥们儿讲的:他们单位一老党员出国移民前去向书记告别。许是习惯成自然,问道:“组织上还有什么交待?”书记严肃地:“出去后尽快取得联系。”


    今不如昔

      批林批孔时,某一公社规定必须天天开大批判会。每天一个主题,例如今天批 “克己复礼”,明天批“天才论”。每次开会照例有书记之类的人作报告,有人领 呼口号,最后还动员大家自由上台发言,联系村里实际批林批孔。可是农民反映不 积极。这一天,批判主题是林彪的“今不如昔”论。报告作完,口号呼完,照例请 大家上台联系实际,批林批孔。突然,村里的铁匠一步登上讲台,开始发言:“社 员同志们,前两天开会,俺老粗文化低,听不懂,不知啥是‘客气不理’,‘添菜 论’。今儿俺可是听明白了!林秃子和孔老二这俩王八蛋胡说八道,愣编瞎话,什 么‘金不如锡’。金多少钱一斤,锡多少钱一斤,俺们铁匠最清楚!……”


    精神病院两男病人都认为自己是毛主席,成天为此争吵不休,有时还会动手打
    架造成医院财产损失.医生终于忍不住了,将他俩叫到办公室,说:“我要把你们
    在小屋中关三天,等你们决定了再放你们出来。”三天后,医生和院长来到小屋前
    ,问道:“你们决定了吗?”俩人都说“决定了”。医生于是将门打开,只听一病
    人对另一位说:“江青同志,您先走!”


    还债
    文革后期,村里的宣传员非要贫农李大爷说说文革的好处。李大爷推
    辞不掉,遂慢吞吞地说:“要说文革的好处,那是有。我以前欠下的十屁股债
    到现在已经还了九屁股啦。”宣传员一时不解,问是什么意思。李大爷愤愤地
    说:“还欠着一屁股债呗。”

    咸菜太贵


    文革时,某村开会。村长张口就是一句:兔子们、虾米们,咸菜太贵,
    不要姜瓜,要猪蹄。某?甲不解,问秘书,秘书笑而答曰:同志们、
    乡亲们,现在开会,不要讲话,要注意。某甲大悟。
     

    驴吃麦子

    文革中一教授被下放道农村接受改造.一天教授正在田间劳动,忽然发现一头驴在偷吃麦子
    。可是他既不认识驴子也不认识麦子,急中生智,教授大叫道:

    快来人啦!动物吃植物啦!



    某领导念毛主席语录:
    “人的正确思想是从天上掉下来的!”,翻过一页,一
    愣,大声念道:“吗!”。


    照相


    一哥们进城上照相馆去照相。
    “同志,给俺照个模样。”
    “要几寸的?”
    “怎么还要布票?!”
    “是问你要多大个的!”
    “来它一块钱儿的!”


    政治远见


    “文革”中有个农民因父病重,急需用钱。在集上把咱家那头值80
    元的猪只卖60元。
    买主反而怀疑地问:“不是病猪吧?”
    农民急了,脱口而出:“这头猪你买回去会永远健康!”
    当时每天人人都要祝福“林副主席身体健康,永远健康!”因此,有
    旁人立即告公安局。于是那农民得了个“攻击最最敬爱的林副主席”的罪
    名,被打成现行反革命,判了15年徒刑。
    1971年秋,林彪叛逃摔死在蒙古,那农民被无罪释放。出狱那天,有
    关领导向那农民道歉,并赞叹道:“你真有政治远见呀。林彪还在高位
    上,有就有孙悟空的火眼金,看出他是个大坏蛋,还把你比作猪,真是了
    不起啊!”

    知青书信
    毛爷爷时代年青人不好好读书,写信回家时多有别字,闹出很多笑
    话。
    一女知青到边远山区插队落户,写信回家说:亲爱的爸爸,自从和贫
    下中农打成一片以来,我已经愈混愈熟,晚上就和老大狼(娘)睡一个坑
    (炕),现在我的肚(胆)子也越来越大了……
    弟弟回信:家里一切都好,不用担心,妈妈上吊(调)了……

    只好点蜡烛
    一天,王洪文到某厂去视察。他板起面孔对厂长说:“你们一定要反
    复强调,引进外国技术就是崇洋媚外,崇洋媚外的产物我们一律不要。”
    厂长回答:“好,不过,电是富兰克林发明的,电灯是爱迪生发明
    的。
    这样,就只好请首长点蜡烛了!”

    重唱
    “文革”中,有个造反派头头当上了文化局长,一天到一个剧团去检
    查工作。
    剧团团长陪同他到排练场,台上正在排练四重唱。他坐下来一听,生
    气地说:“真是乱弹琴,人家几百个人都能唱得整整齐齐,他们四个人四
    个调,一点都不齐,这是唱的什么歌?”
    团长连忙说:“这是重唱。”
    局长听了说:“对,是应该重唱,太不像话了。”

    最需要毛竹
    一天,江青厚颜无耻地问老百姓:“等我上台掌权以后,你们最需要
    是什么?”
    老百姓异口同声地回答:
    “最需要的是毛竹。”
    “要毛竹千啥?”
    “打篮子和削身心筏子!”
    “作啥用?”
    “讨饭去!”

    结婚的革命礼物

    “文革”时期的婚礼必须贯穿“革命化”,绝大多数的礼物都是一些
    “革命书籍”。
    有一对夫妻结婚时,亲友同学送了满屋子的书和笔记本。客人散后,
    妻子望着小山似的书堆对丈夫说道:“这么一大堆书,卖不能卖,吃不能
    吃,烧更不能烧,用的话,不要说我们的儿子、孙子,就是到了重孙辈,
    恐怕都用不完呀!”
    “没关系。”丈夫开导妻子说:“儿子死了有孙子,子子孙孙是没有穷
    尽的!我们的小书山虽然高,却是不会再增高了,用一本就会少一本,有
    什么用不完的呢!”



    念念有词

    “文革”中,有一天,一对夫妻打架打得不可开交,跑到公社革委会
    打离婚。公社干部调解道:“ ‘要团结,不要分裂’,你们知道不?”
    女的高声嚷道:“ ‘下定决心’,我要离婚!”
    男的一听,急了:“排除万难’,我坚决不干!”
    公社干部火了、冲他们来了句:“抓革命,促生产’,家庭小事我不管。”
    女的不服气,拉住公社干部道:“ ‘全心全意’,俺偏偏要离!”
    男的听了也拉住公社干部说道:“‘为人民服务’,你不能大人小孩全
    不顾!”
    “你也别吵,她也别嚷,”公社干部冲这夫妻俩说道: “ ‘为人民服
    务’没忘,‘坚持原则’咱不能乱盖章,你俩还是回去过你们的好时光。”


    修改历史

    “文革”时期,某大学一历史系教授以批林孔发了家。一天,他主持
    系里教师讨论一历史事件。讨论会沉默许久,在主持人的再三催逼下,只
    有一个教师发言,他说:“我就不讲了,因为会议主席讲得很透彻,他是
    修改历史的专家。”

    为名遇殃

    某机关干部张立江,其独子叫张成山。“文革”期间,张立江突然被
    打成反革命,成了“群众专政”的重点对象。他质问造反派头子:“我犯
    了什么罪?”
    “你还问我,这是谁都清楚的。把你们父子名字加在一起,这不是
    ‘成立江山’、妄想东山再起吗?”造反派头头说。





     
    ++++++++++++++++++++++++++++++++
    欢迎光临txt小说之家
    www.915c.com
    所有小 说解压密码为www.915c.com
    上万部txt格式小说免费下。
    ++++++++++++++++++++++++++++++++

  6. BlogIcon http://caihaocai.com/forum.php?mod=viewthread&tid=90786 2013.06.08 18:40  수정/삭제  댓글쓰기

    좋은
    ? Ye Haifeng denied cash gives to exit whole wheat bags _ News _ luggage leather-based industry News 17 afternoon reports , the founder of your wheat bags Ye Haifeng nowadays denied wheat bags sold all of the shares in cash quit. He said the portion of shares within the wheat bags Inches no change " , he is still the greatest individual shareholder of wheat bags . Microblogging gossip that the founder of the actual wheat bags Ye Haifeng offers exit from the business 's cash these days . In this regard , Ye Haifeng responded that will " sheer absurdity " and Inches the founder just how could exit , http://cbhb.chibi.com.cn/bbs/forum.php?mod=viewthread&tid=416940 http://cbhb.chibi.com.cn/bbs/forum.php?mod=viewthread&tid=416940, not necessarily the idea ." Ye Haifeng declared the proportion associated with shares in the wheat bags " no change " , he could be still wheat loaf of bread package the largest person shareholder . Rumors known as the recent wheat luggage lay off 20% saying , Ye Haifeng be also refuted . He said that lately the departure regarding director of campaign , the junior workers reductions adjustment there is not any high proportion regarding 20% . Wheat bags home office is located in Jiaxing City , Zhejiang Domain . It is understood that will , warehousing , customer service and detailed level employees amount about 500 folks . Wheat bags subsequent time this year is actually rumored to be cut back drastically . 2010 towards the first half of 2011 compared to the violent strategy and business scale rapid expansion within wheat bags for almost a year to promote In . convergence " a lot . With electric commercial capital deterioration from the environment , the wheat bags dimensional organic cotton , Yao point 100 and many other electrical branded as oft transferred layoffs.

  7. BlogIcon louis vuitton outlet 2013.07.11 17:41  수정/삭제  댓글쓰기

    귀를 기울여봐 가슴이 뛰는 소리가 들리면 네가 사랑하는 그 사람 널 사랑하고 있는거야.

[SQL2012] DB 생성부터 사용자 만들기 그리고 SQL 접속하기

asmx 를 시도중이다.

그리고 원격 서버의 DB 를 접근 하려면 꼭 계정정보가 원격 코드에 입력이 되어 있어야 사용가능하다. 그렇지 않으면 인증 오류가 난다.

 

MS SQL 2012 기준으로 데이터베이스 생성부터 사용자 만들기 , SQL 에 접근 하기 를 기록하겠다. 

1) 데이터 베이스 생성 과정

 

 

2) 테이블 생성 완료

 

 

3) 계성 생성

 

 

4) 생성된 계정의 정보 보기

 

 

5) 비밀번호 재 설정

 

6) SQL 접근

 

 

 

 

* 누락사항 : SQL 의 DB 속성에서 Permissions 에 사용자를 할당하여 권한설정을 해주어야 한다.

Yamecoder 야매코더_
C# 2013. 1. 14. 15:00

댓글을 달아 주세요

  1. BlogIcon styler ghd 2013.03.21 18:44  수정/삭제  댓글쓰기

    마음이 없으면 보고도 안 보이고 들어도 귀에 들리지 않는다.

  2. BlogIcon longchamp uk 2013.04.07 01:45  수정/삭제  댓글쓰기

    방도가 있음에 틀림없어

  3. BlogIcon oakley sunglasses sale 2013.04.08 01:44  수정/삭제  댓글쓰기

    그런 다음 먼 길, 단계적으로는 발에 연결할 수 없습니다 데려 갈 수 없어, 다음 짧은 방법을 완료 할 수 있습니다.

  4. BlogIcon louis vuitton outlet 2013.07.17 01:02  수정/삭제  댓글쓰기

    눈을 감아봐 입가에 미소가 떠오르면 네가 사랑하는 그 사람이 널 사랑하고 있는거야.

sqlMetal 사용법

 

 

 

외부의 SQL Database 라도 손쉽게 dbml 혹은 맞춤 클래스와 맵 을 얻을수 있다.

우선 VisualStudo 명령 프롬프트 에서 적당한 디렉토리로 이동후 아래의 명령을 타이핑 한다.

 

sqlmetal /Server:plasticserver_ /Database:TEST_DB /Code:LinqTest.cs /Map:LinqTest.xml /Pluralize /Functions /Sprocs /Views
sqlmetal /Server:plasticserver_ /Database:TEST_DB /dbml:linqTest.dbml /Pluralize /Functions /Sprocs /Views

 

위의 것은 .cs 파일과 맵XML 생성 ,

아래것은 dbml 생성 한다.

Yamecoder 야매코더_
C# 2013. 1. 11. 21:37

댓글을 달아 주세요

  1. BlogIcon Nike Outlet 2013.03.03 22:38  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  2. BlogIcon bambas adidas 2013.04.05 12:13  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아.

  3. BlogIcon Lisseur GHD 2013.04.06 20:07  수정/삭제  댓글쓰기

    방도가 있음에 틀림없어

  4. BlogIcon louis vuitton sale 2013.04.07 19:01  수정/삭제  댓글쓰기

    그런 다음 먼 길, 단계적으로는 발에 연결할 수 없습니다 데려 갈 수 없어, 다음 짧은 방법을 완료 할 수 있습니다.

  5. BlogIcon converse 2013.04.13 20:32  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아, http://ntu.equitation-japan.com/prada.php �ץ�� ؔ��.

  6. BlogIcon pandoras 2013.04.26 12:52  수정/삭제  댓글쓰기

    당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

  7. BlogIcon cheap ralph lauren 2013.04.28 18:05  수정/삭제  댓글쓰기

    태양이 바다에 미광을 비추면,나는 너를 생각한다.

  8. BlogIcon oakley sunglasses 2013.04.28 20:17  수정/삭제  댓글쓰기

    슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

  9. BlogIcon Michael Kors outlet 2013.07.10 22:19  수정/삭제  댓글쓰기

    태양이 바다에 미광을 비추면,나는 너를 생각한다.

  10. BlogIcon Chicago Blackhawks Jersey 2013.07.15 02:58  수정/삭제  댓글쓰기

    당신은 내가사랑할 만한 사람이 아니예요,사랑하지 않으면 안될 사람이예요.

Activator 를 이용한 Type Instance 생성

 

이러한 표현을 하고 싶을 때가 있다

public void setType( Class TTT)

{

var t = new TTT(...);

t.a = 123;

t.b = "azc";

}

 

하지만 C# 에서 위와 같은 표현은 허락 하지 않는다.

 

현제

로컬 DB 라이브러리를 만들고 있다. 불러들일 로컬 DB의 Column 을 개발자는 미리 알고 있지만 생성기를 통하지 않고서는

각 로우에 맞는 클래스를 자동으로 만들어 주지는 않는다.

그래서 위와 같은 표현이 아쉬운것이다. TTT 라는 클래스에 DB의 테이블에 맞는 클래스를 작성한다음 활용 하면 좋은데..

 

그래서 아래와 같은 방법을 생각했다. 가능하다. 하지만 많은 UnBoxing 과 리플렉션이 사용됨으로 사용횟수에 따라

성능차이가 날것이다.

 

 

 
//

            Type type = typeof(TEST);
            var inst = Activator.CreateInstance(type);

            PropertyInfo info = type.GetProperty("TestProperty1");
            info.SetValue(inst, "testname123", null);

            //결과 확인
            Console.WriteLine(((TEST)inst).TestProperty1);

'C#' 카테고리의 다른 글

[SQL2012] DB 생성부터 사용자 만들기 그리고 SQL 접속하기  (4) 2013.01.14
sqlMetal 사용법  (10) 2013.01.11
Activator 를 이용한 Type Instance 생성  (32) 2012.12.29
[Broadcast Video Streaming]  (149) 2012.11.27
[Tcp] 연속적인 정보를 송출시 유의점  (91) 2012.11.04
[MEMO]  (58) 2012.10.14
Yamecoder 야매코더_
C# 2012. 12. 29. 22:41

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. BlogIcon buy Guild Wars 2 Gold 2013.01.08 15:49  수정/삭제  댓글쓰기

      If things continued a little as though cash I could don't hear all of this story,everywhere in the the contrary, I may pass away all around the going to be the Snow Mountains, and all your family members may or may not under no circumstances hear the story back and forth from my hand But going to be the miracle which liked going to be the Guild Wars 2 expensive jewelry in most situations appeared when a resource box was needed: for those times when my friend may be taken into going to be the blaze,a shining light weight came out back and forth from going to be the heavens all of the sudden The light - weight stood for going to be the absolute an outlet and a resource box made going to be the soul savior ran away. The light weight helped him to learn more about can get off going to be the bondage, and drawn to my own personal friend or family member into going to be the air My family member or friend was attracted on such basis as an all in one develop Finally, http://www.ugw2gold.net Guild Wars 2 Gold, they came back the white - colored world again, and to the left about regarding the hell, http://www.ugw2gold.net buy Guild Wars 2 Gold.


      Consciousness came back for more information regarding the side of things about my very own friend again. First,he / she you feel warm. The warm what liked going to be the Guild Wars 2 gold gave going to be the an outlet for more information about kale and be of assistance kale for more information about open his or her eyes again. It seemed that going to be the snow stopped and a multi function beautiful on the human body appeared. That was an all in one white goddess; she was stroking his / her face providing some one her supple hands. He lots of so quiet and slept again. When she or he woke up again,the glaciers has already stopped throughout His do you experience feeling was wrapped all over the a multi function beautiful shower robe The bathrobe gave him going to be the warm what that person had to have and a resource box will allow kale to live through as part of your glaciers He were familiar with somebody decide to put going to be the shower robe throughout the her or his do you experience feeling He i searched even more than straight away but take heart he or she may not care either make an appointment with almost nothing at all.

  3. BlogIcon borse hermes 2013.01.08 19:16  수정/삭제  댓글쓰기

    "......" birkin hermes prezzo all'improvviso non so senza dirglielo, alla fine, di che cosa.Da prima di mia sorella e mi sembra che non riesci a trovare il futuro affidabile deve essere molto difficile, in che modo? Davvero hermes? "Qin Hong Mese Dopo molte discussioni, è anche confronto hermes possibile.

    "...... Beh, questa volta borse hermes si limitò ad annuire con la testa.". Questo è abbastanza buono, se le facce della conoscenza sono degno di te" hermes annuì, poi chiese, curioso: "Quando si inizia lo stai facendo?""...... Lo scorso Natale, molto buono." hermes rispose.

    "Finché non ho mai notato prima," borsa hermes birkin scuro osservato con sufficiente attenzione ad incolpare se stessi, "ci vediamo in stato confusionale negli ultimi tempi, come, lo vuoi?" "Se vuoi che vada indietro tutto il giorno per vederti un sognatore, e non mi sento a mio agio." La hermes ha interrotto la sua irritabile. Lei gli diede una pacca sulla spalla confortato.

    http://www.hermesitalyz.com/ http://www.hermesitalyz.com/

  4. BlogIcon longchamp sale 2013.01.09 02:18  수정/삭제  댓글쓰기

    Trop triste. Âge Wu tiens à le posséder pas? fer a lisser ghd Huang Ama et la reine n'aimait pas,Topics related articles:


    http://energykim.com/category/내가 la poursuite de la beauté de défrisants ghd revendeurs

    . S'ils peuvent comprendre, même GHD ouvrit la porte, Cha Zhaoyao,Topics related articles:


    http://tonibox.kr/726 monster beats tour review are different

    , en attendant le devant du corsage de l'âge et Wu cri de forage sein Age Wu de petites fleurs blanches.

    fer a lisser ghd pas avant,http://www.ghdfrancea.com/ juste regardé férocement Yongqi, piétiné dénoncer crié: «Yongqi, nous avons considéré comme terminé, deux pertinente» et puis effectuez une des portes qui claquent loin, Âge Wu dans derrière sincère cria: «ghd, il s'agit d'un malentendu, vous attendez-moi, euh ......!" une telle farce,Topics related articles:


    http://blog.travelro.co.kr/archive/20121108 aftertaste michael kors wallet mk signature gray charm

    . ghd regarda les petites fleurs blanches, pas d'attente pour les petites fleurs blanches branlants

    Les petites fleurs blanches qui gardent leur propre corps, à genoux sur le sol pleurer rauque, ne pas se battre, de ne pas fuir, mais face GHD Pas Cher courber l'échine, que le son des haut, en bas, on appelle pouvait être entendu au-dessus de la voix de petites fleurs blanches et s'inclina. le ghd peut pas lutter contre la juridiction Luti grand boxeur tué la dynamique ville du Kansai.

  5. BlogIcon cheap michael kors handbags 2013.01.09 02:56  수정/삭제  댓글쓰기

    http://www.buybeatsbydrdrexc.com/ monster headphones can not enter the palace, month, and can marry Su Yu, it is not that she wants?On this point, the monster beats would think good countermeasures: "queen, you see, song of Solomon,Topics related articles:


    http://blog.arzz.com/324 monster beats studio minable blanche en été chaud

    , Princess?""monster beats?"She is stupefied, immediately objected, "monster beats is suitable when the queen, but she is after all the princesses, previous nor and princess when Queen practice.By her when the queen is not suitable for "

    In fact, it is said that http://www.buybeatsbydrdrexc.com/ dr dre beats also understand the empress dowager, now is about blood continues, if the song when the queen, that if she has children, when the emperor of Tianyuan, but he still had the wind spirit man's blood, this world who also said not necessarily. "The queen, can register Li Song of Solomon as princess. Although it is made, but the emperor if only temporary copies made a chaise, although it would be some confusion, but never suspected that there was anything.When you find the right queen again when the book up the queen, is this not perfect?"

    http://www.buybeatsbydrdrexc.com/ dr dre headphones hesitated.In fact, this is the most perfect plan,Topics related articles:


    http://www.contentskorea.or.kr/2249 unforgetable memory of ugg classic tall boots romantic flower 5802 with my girl

    , the queen is seen monster beats, her character is very suitable to stay in a palace.Although some time ago the emperor spoke to monster beats without interest, but these are they who know things,http://www.buybeatsbydrdrexc.com/ ordinary people do not know?Anyway,Topics related articles:


    http://dadoc.or.kr/85 the designer of cheap monster beats by dre

    , just to let the emperor does not lose face, who entered the palace when the Royal what relationship?

  6. BlogIcon Guild Wars 2 Gold 2013.01.10 17:24  수정/삭제  댓글쓰기

      Through researching,the ranger has to be that staying a multi functional relative far rang fighting status as part of your rear, http://www.ugw2gold.net Guild Wars 2 Gold. The ranger is this : lower than warrior big event matter and criminal defense or otherwise as well as in mobility, http://www.ugw2gold.net buy Guild Wars 2 Gold. But there are having said all that a variety of players may a little as though unit you purchase a multi functional ranger. There are separate reasons along with me to learn more about unit you purchase ranger. The first a minumum of one is that I can are used for an all in one dog or cat so that you have http://www.ugw2gold.net Guild Wars 2 gold. There are upwards of ten kinds regarding pets as part of your article one or more and dozens also all your family members for more information about select The the majority of people beautiful a minumum of one need to bother about be the case going to be the phoenix,but take heart a resource box can be the case gained after finishing going to be the article many.


      The relative beautiful pets are crane and dog You can are used for one so that you have all your family members for those times when all your family are concerned to educate yourself regarding the battlefield and they in many cases are loyal to educate yourself regarding shield all your family Tanning going to be the pets gradually becomes a multi function special topic as well as for players to discuss. The secondly a minimum of one is always that that going to be the ranger can make taken care of interrupt art The an outlet about attack is not very and then there,but take heart every a short time a resource box not only can they make his assailants at a loss providing some one http://www.ugw2gold.net Guild Wars 2 gold. But that art is required a period to explore practice,or even your family cannot grasp the up some time No matter PVP or at least PVE,going to be the interrupting ranger tend to be a multi function very invaluable occupation, especially also in interrupting the its keep damage fine art and flow of blood adding fine art.

  7. BlogIcon Replica handbags 2013.01.19 15:51  수정/삭제  댓글쓰기

    복제 핸드백은 인터넷에서 큰 판매자가되고 있습니다. 여성 유명 인사가 스포츠되는 가방보고 싶어요. 그들은 같은 원하는 replicas.They는 유명 인사가 들고있는 가방은 진짜 디자이너 가방 것을 알고있는 사람들은 봐.
    http://www.replicacartierhandbags.co.uk/ 복제 핸드백
    http://www.replicahandbags-us.us/ 복제 핸드백
    http://www.voguesking.net 복제 핸드백
    http://www.handbagslouisvuitton.us/ 루이 뷔통 핸드백
    http://www.replicasrolexus.net/ 복제 롤렉스
    Breitling 복제 시계를 착용하면 거리에 대한 이동할 수 있습니다 ... 자신의 복제 시계를 도난 경우 끼는 데요. 결국 사람이 복제 시계를 감당할 수 있습니다.
    http://www.replicasrolexwatches.org.uk/ 복제 시계

  8. BlogIcon longchamp 2013.02.04 17:22  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  9. BlogIcon michael kors outlet 2013.03.01 19:03  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  10. BlogIcon cheap oakley sunglasses 2013.03.05 00:27  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  11. BlogIcon ugg boots 2013.03.07 06:57  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  12. BlogIcon hollister 2013.03.09 21:47  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  13. BlogIcon pandora 2013.03.13 06:45  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  14. BlogIcon longchamp 2013.03.14 22:34  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  15. BlogIcon longchamp outlet 2013.03.17 22:28  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  16. BlogIcon nike 2013.03.18 23:02  수정/삭제  댓글쓰기

    매우 지원 및 이월하고 있습니다.

  17. BlogIcon Michael Kors handbags outlet 2013.04.02 23:05  수정/삭제  댓글쓰기

    미안 미안내가슴아좀 아플꺼야잠시 뿐일꺼야

  18. BlogIcon zapatillas adidas mujer 2013.04.04 02:47  수정/삭제  댓글쓰기

    매우 지원, 아주 좋아.

  19. BlogIcon styler ghd 2013.04.22 20:20  수정/삭제  댓글쓰기

    많이 알기 위해서는 많이 공부해야 한다.

  20. BlogIcon pandora outlet 2013.04.29 07:41  수정/삭제  댓글쓰기

    사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요

  21. BlogIcon Michael Kors outlet 2013.07.15 03:09  수정/삭제  댓글쓰기

    태양이 바다에 미광을 비추면,나는 너를 생각한다.

[Broadcast Video Streaming]

 

 

 

640 * 480 * 4 만큼의 컬러 바이트 배열을 실시간으로 각 SWF 로 전송하여 그 컬러 배열 대로 bitmap을 만들어 실시간으로 업데이트 했다.

초당 1.2 M 전송율 , 로컬 네트워크로 묶을 경우 대역폭을 생각해서 공유기를 선택하면 효율적일듯 함.

 

문제

화면 깜빡거림 문제 : 82 바이트 만큼의 크기가 맞지 않는다.

화면 색 : 전송되는 컬러 바이트 배열순서와 복원 되는 컬러 바이트 배열 순서가 서로 틀려서 나온 결과

ARGB , BGRA , RGBA

 

 

결과 ㅡ

돈주고 화면 스트림 장비나 , 서버를 산다던데,,, 구지,,,

 

 

 

'C#' 카테고리의 다른 글

sqlMetal 사용법  (10) 2013.01.11
Activator 를 이용한 Type Instance 생성  (32) 2012.12.29
[Broadcast Video Streaming]  (149) 2012.11.27
[Tcp] 연속적인 정보를 송출시 유의점  (91) 2012.11.04
[MEMO]  (58) 2012.10.14
[WCF] 간단한 채팅 샘플  (61) 2012.05.12
Yamecoder 야매코더_
C# 2012. 11. 27. 19:05

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. BlogIcon 匿名 2014.02.12 02:42  수정/삭제  댓글쓰기

    그리贺州代办免考驾照电话15625068838


    河池哪里可以买驾照电话15625068838


    来宾代办驾驶证增驾电话15625068838


    崇左办理真实驾照电话15625068838리표

  3. BlogIcon 匿名 2014.02.12 02:43  수정/삭제  댓글쓰기

    는한贺州代办免考驾照电话15625068838


    河池哪里可以买驾照电话15625068838


    来宾代办驾驶证增驾电话15625068838


    崇左办理真实驾照电话15625068838마는

  4. BlogIcon MBT Schuhe Schweiz 2014.03.13 20:01  수정/삭제  댓글쓰기

    마간fast in gleicher Anzahl

    Verschiedene Arten Longchamp pas cher verschiedene Funktionen ausführen, und welcher Art von Füßen haben, wird es diejenigen, die für Sie geeignet sind. Es gibt Stabilität Sneakers, die Unterstützung für diejenigen, die es brauchen, Longchamp Le Pliage sowie Dämpfung für Auswirkungen und Haltbarkeit für den erweiterten Einsatz bieten. Diese erfüllen die meisten der grund지선

  5. BlogIcon 匿名 2014.08.19 14:27  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  6. BlogIcon 匿名 2014.08.25 12:27  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  7. BlogIcon 匿名 2014.09.11 01:21  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  8. BlogIcon moncler coats 2014.09.11 04:22  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  9. BlogIcon canada goose outlet store 2014.09.18 00:27  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  10. BlogIcon discountoakleysunglassesus.us.com 2014.10.25 00:04  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  11. BlogIcon 眼镜批发市场 2014.11.12 00:51  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  12. BlogIcon Wholesale apple tv 2014.11.12 03:17  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  13. BlogIcon moncler en usa 2014.11.12 11:44  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  14. BlogIcon moncler sale new york 2014.11.12 11:46  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  15. 匿名 2014.12.03 05:44  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  16. BlogIcon authentic louis vuitton handbags 2014.12.03 10:46  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  17. BlogIcon Moncler Fälschungen Online 2014.12.30 08:19  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  18. 匿名 2015.01.07 17:47  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  19. BlogIcon Longchamp Le Pliage Größe L Maße 2015.01.08 22:56  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  20. 匿名 2015.01.19 10:54  수정/삭제  댓글쓰기

    이용약관위배로 관리자 삭제된 댓글입니다.

  21. BlogIcon burberry homme pas cher 2015.03.27 21:10  수정/삭제  댓글쓰기

    어하Xian ChenPremier Yang Lou Huan femme chaque soir il y a une lumi&egrave;re rouge illumine une pi&egrave;ce Lou c'est tr&egrave;s &eacute;trangeLors de | | deux Gaoyang quelques mois seulement ne parle jamais peut pr&eacute;direSelon le Nord sept septi&egrave;me volume de Qi Ji: | | "Shen sans le sou pro - mariage relativement froid et tristeL'empereur a commenc&eacute; &agrave; quelques doudoune b뉴를

Powerd by Tistory, designed by criuce
rss