'MS/C#'에 해당되는 글 24건

  1. 2011.04.13 Thread 내에서 화면 Control들 상태 또는 속성 값 변경
  2. 2010.01.09 C# 마샬링 구조체로 가지고 놀아보자.. 1
  3. 2009.01.24 Setting 부분 파일화.. (HashTable 이용)

Thread 내에서 화면 Control들 상태 또는 속성 값 변경

|
Thread 내부에서 Control의 속성을 변경은 해당 Thread Method내에서는 불가능 하다.
Control도 따로 Thread가 돌아가기 때문에 해당 Thread Method내에서 Control Thread에 접근 할 수 없기 때문이다!! 하지만 접근 할 수 있는 방법이 있다.
바로 대리자를 이용하여 접근 하는 방법이다.

내용을 대충 보면
private delegate void ControllImageChange(int type, int index, int stat)

ThreadMethod()
{
    this.Invoke(new ControllImageChange(delegateModule), new object[] { arg1, arg2, arg3 });
}

private void delegateModule(int type, int index, int stat)
{
    //-----------------------------------------
    //Control 제어 내용 (Data 및 속성 값 변경)
    //-----------------------------------------
}

이러한 내용이다.

this.Invoke 를 이용하여 변경한다!
form 전체가 될 수 도 있고 해당 Control만도 접근 가능하다
해당 Arg도 줄 수 있다!! 이런식으로 해당 Control에 Data를 실시간으로 Update 가능 한 형태로 제작 가능하다!!
And

C# 마샬링 구조체로 가지고 놀아보자..

|
Serializable : 문자로 변환하기 위해서 선언(? 알려주기정도..)해준다.
StructLayout(LayoutKind.Sequential) : 나 구조체야 라고 선언한다

Pack=1
: Pack 단위로 만든다(Size만큼 정확히 만들어 준다)
CharSet=CharSet.Ansi : OS의 구조체 Padding값도 들어가 계산된다.

    어떻게? 선언한 순서로 순차적으로 만들어 줘 라고
MarshalAs(UnmanagedType.ByValArray, SizeConst = 배열수)
    배열을 만들꼬다.. , (SizeConst = )개수 만큼!
이 외에도 UnmanagedType.ByValTStr(문자배열 Type은 string으로 줘도 된다)

    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack=1)]
    public struct _HMIData
    {
        public _hmi_macsta hmi_macsta
    }
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack=1)]
    public struct _hmi_macsta
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1100]
        public short[] oth_sta;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 298)]
        public short[] bcdv_sta1;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 298)]
        public short[] bcdv_sta2;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 15)]
        public string start_time;
    }


열쉬미 만들었으면 생성해서 Read And Write ~~!!


    public partial class ShmDataView : Form
    {
        public _HMIData HMIData;
        public int ShmStructSize;
        public byte[] HMIBuffer;

	public ShmDataView()
        {
            InitializeComponent();
            InitHMIData();
        }

        private void InitHMIData()
        {
            HMIData = new _HMIData();
            ShmStructSize = Marshal.SizeOf(HMIData);
            HMIBuffer = new byte[ShmStructSize];
	    HMIData = (_HMIData)RawDeSerialize(HMIBuffer, HMIData.GetType());
        }


        public byte[] RawSerialize(object ShmStruct)
        {
            IntPtr buffer = Marshal.AllocHGlobal(ShmStructSize);
            Marshal.StructureToPtr(HMIData, buffer, false);
            byte[] RawData = new byte[ShmStructSize];
            Marshal.Copy(buffer, RawData, 0, ShmStructSize);
            Marshal.FreeHGlobal(buffer);
            return RawData;
        }

        public object RawDeSerialize(byte[] RawData, Type ShmData)
        {
            int RawSize = Marshal.SizeOf(ShmData);

            //Size Over
            if (RawSize > RawData.Length)
            {
                return null;
            }

            IntPtr buffer = Marshal.AllocHGlobal(RawSize);
            Marshal.Copy(RawData, 0, buffer, RawSize);
            object retobj = Marshal.PtrToStructure(buffer, ShmData);
            Marshal.FreeHGlobal(buffer);
            return retobj;
        }
    }


public byte[] RawSerialize(object ShmStruct)
요녀석은 구조체로 되어있는 내용은 byte배열로 만들어준다

public object RawDeSerialize(byte[] RawData, Type ShmData)
요녀석은 byte배열로 되어있는 녀석을 구조체(object)로 반환해 준다.

그냥 sizeof하믄 안나온다
Marshal.SizeOf(객체)
이정도로 해줘야 C언어의 sizeof(구조체) 이렇게 한거와 같은 형태가 나온다
And

Setting 부분 파일화.. (HashTable 이용)

|

file을 불러온후 HashTable에 셋팅하여 사용

셋팅 파일에는 한줄 주석으로 '#'사용 가능

ID는 공백사용 불가

And
prev | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | next