'MS/C#'에 해당되는 글 24건
- 2011.04.13 Thread 내에서 화면 Control들 상태 또는 속성 값 변경
- 2010.01.09 C# 마샬링 구조체로 가지고 놀아보자.. 1
- 2009.01.24 Setting 부분 파일화.. (HashTable 이용)
Thread 내부에서 Control의 속성을 변경은 해당 Thread Method내에서는 불가능 하다.
Control도 따로 Thread가 돌아가기 때문에 해당 Thread Method내에서 Control Thread에 접근 할 수 없기 때문이다!! 하지만 접근 할 수 있는 방법이 있다.
바로 대리자를 이용하여 접근 하는 방법이다.
내용을 대충 보면
이러한 내용이다.
this.Invoke 를 이용하여 변경한다!
form 전체가 될 수 도 있고 해당 Control만도 접근 가능하다
해당 Arg도 줄 수 있다!! 이런식으로 해당 Control에 Data를 실시간으로 Update 가능 한 형태로 제작 가능하다!!
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 가능 한 형태로 제작 가능하다!!
Serializable : 문자로 변환하기 위해서 선언(? 알려주기정도..)해준다.
StructLayout(LayoutKind.Sequential) : 나 구조체야 라고 선언한다
Pack=1 : Pack 단위로 만든다(Size만큼 정확히 만들어 준다)
CharSet=CharSet.Ansi : OS의 구조체 Padding값도 들어가 계산된다.
어떻게? 선언한 순서로 순차적으로 만들어 줘 라고
MarshalAs(UnmanagedType.ByValArray, SizeConst = 배열수)
배열을 만들꼬다.. , (SizeConst = )개수 만큼!
이 외에도 UnmanagedType.ByValTStr(문자배열 Type은 string으로 줘도 된다)
열쉬미 만들었으면 생성해서 Read And Write ~~!!
public byte[] RawSerialize(object ShmStruct)
요녀석은 구조체로 되어있는 내용은 byte배열로 만들어준다
public object RawDeSerialize(byte[] RawData, Type ShmData)
요녀석은 byte배열로 되어있는 녀석을 구조체(object)로 반환해 준다.
그냥 sizeof하믄 안나온다
Marshal.SizeOf(객체)
이정도로 해줘야 C언어의 sizeof(구조체) 이렇게 한거와 같은 형태가 나온다
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(구조체) 이렇게 한거와 같은 형태가 나온다
file을 불러온후 HashTable에 셋팅하여 사용
셋팅 파일에는 한줄 주석으로 '#'사용 가능
ID는 공백사용 불가