class WindowsManageFrm : Form
{
    System.Windows.Forms.ListBox listBox1 = null;
    System.Windows.Forms.ListBox listBox2 = null;

    void init()
    {
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.listBox2 = new System.Windows.Forms.ListBox();
        this.SuspendLayout();
        this.Controls.Add(this.listBox1);
        this.Controls.Add(this.listBox2);
        this.ResumeLayout(false);

        this.listBox2.Items.Add("KKKKKKK");
        this.listBox2.Items.Add("MMMMMMMMMMMMMMM");
        this.listBox2.Items.Add("KKKKKKK");
    }
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
const int WM_KEYDOWN = 0x0100, WM_SYSKEYDOWN = 0x0104;
if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
         switch (keyData.ToString())
         {
case "Return" :
Console.WriteLine(this.listBox2.SelectedItem.ToString());
break;
case "Escape" :
DialogResult dialogResult = MessageBox.Show("Quit!!", "Inform",
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
if (dialogResult == DialogResult.OK) Application.Exit();
break;
         default:
             break;
        }
    }

}

비고)
// 0->ID, 1->Handle, 2->Seq
string[] split = recv.id.Split('.');

ex40.cs
0.00MB
ex41.cs
0.00MB




using System.Runtime.InteropServices;

class UAPDBMQ0010 : Form
{
IntPtr tailHandle = IntPtr.Zero;
System.Timers.Timer tm = new System.Timers.Timer();
string qryText = "";

[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);
        [DllImport("user32.dll")]
        public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

public UAPDBMQ0010(IntPtr prmHandle, string qryFileName)
{
tailHandle = prmHandle;

tm.Elapsed += new ElapsedEventHandler(____time_tick);
qryText = System.IO.File.ReadAllText(qryFileName);
}
void ____time_tick(object sender, ElapsedEventArgs e)
{
try
                {
                    byte[] dataByte = Encoding.UTF8.GetBytes(qryText);

                    COPYDATASTRUCT copyData = new COPYDATASTRUCT();
                    copyData.dwData = (IntPtr)0;
            copyData.cbData = dataByte.Length;
                    copyData.lpData = Marshal.AllocHGlobal(dataByte.Length);
                    Marshal.Copy(dataByte, 0, copyData.lpData, dataByte.Length);

                    IntPtr sendData = Marshal.AllocHGlobal(Marshal.SizeOf(copyData));
                    Marshal.StructureToPtr(copyData, sendData, true);

                    IntPtr _result = SendMessage(tailHandle, APMApiPublic.WM_COPYDATA, (IntPtr)index, sendData);

                    Marshal.FreeHGlobal(copyData.lpData);
                    Marshal.FreeHGlobal(sendData);
                }
                catch (Exception exp)
                {
                    Console.WriteLine(exp.Message);
                }
}
}

class APMCommManage : Form
{
IntPtr currentHandle = IntPtr.Zero;

public APMCommManage()
        {
            currentHandle = Handle;
        }
protected override void WndProc(ref Message m)
{
const int WM_PAINT=0x000f;

base.WndProc(ref m);

switch(m.Msg)
{
case WM_PAINT:
break;
default:
break;
}
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
Console.WriteLine("HANDLE:" + "[" + currentHandle.ToString() + "]");
break;
case "Right":
break;
case "Left":
break;
case "Space":
DBMS2022FRM dbms2022frm  = new DBMS2022FRM(currentHandle, "QUERY.567342.001");
dbms2022frm.Show();
break;
case "Escape":
Application.Exit();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}







//IntPtr.ToString 메서드

using System;
using System.Windows.Forms;

class Program
{
public static void Main()
{
Application.Run(new APMCommManage());
#if(false)
APMCommManage nm = new APMCommManage();
nm.running();
#endif
}
}
class DBMS2022FRM : Form
{
public DBMS2022FRM()
{
this.Text = "DBMS2022FRM";
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
break;
case "Right":
break;
case "Left":
break;
case "Space":
break;
case "Escape":
this.Close();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}
class APMCommManage : Form
{
IntPtr currentHandle = IntPtr.Zero;

public APMCommManage()
        {
            currentHandle = Handle;
        }
protected override void WndProc(ref Message m)
{
const int WM_PAINT=0x000f;

base.WndProc(ref m);

switch(m.Msg)
{
case WM_PAINT:
break;
default:
break;
}
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
const int WM_KEYDOWN=0x0100;

if(m.Msg==WM_KEYDOWN)
{
switch(keyData.ToString())
{
case "Return":
Console.WriteLine("HANDLE:" + "[" + currentHandle.ToString() + "]");
break;
case "Right":
break;
case "Left":
break;
case "Space":
DBMS2022FRM dbms2022frm  = new DBMS2022FRM();
dbms2022frm.ShowDialog();
break;
case "Escape":
Application.Exit();
break;
default:
break;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}

/*
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe frm_01.cs
*/



class Program
{
public static void Main()
{
DebugManage nm = new DebugManage();

nm.running();
}
}

public struct COPYDATASTRUCT
{
public IntPtr dwData {get; ste;}
public int cbData {get; ste;}
public IntPtr lpData {get; ste;}
}

public class RcvDefaultResult
{
public string code { get; set; }
public string text { get; set; }
public List<List<string>> data { get; set; }
}
public class PWInterface
{
private RcvDefaultResult _result;
public string id { get; set; }
public string sender { get; set; }
public string proto { get; set; }

public RcvDefaultResult result
{
get { return _result; }
set { _result = value; }
}
}
class DebugManage
{
class dataInterface
{
public List<List<string>> data {get; set;}
}

public void running()
{
int ii,kk;
string formatText="";

COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
byte[] recvData = new byte[cds.cbData];
Marshal.Copy(cds.lpData, recvData, 0, cds.cbData);
FormatText = Encoding.UTF8.GetString(recvData);


try
{
PWInterface ifRecieve = JsonConvert.DeserializeObject<PWInterface>(formatText);

//ifRecieve.result.code
//ifRecieve.result.text
//ifRecieve.result.data.Count
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
try
{
JObject jobject = JObject.Parse(formatText);

string screen = jobject["id"].ToString().Substring(0+1+5+1, 10);
string mmm = jobject["result"].ToString();

dataInterface data;
data = JsonConvert.DeserializeObject<dataInterface>(mmm);

for(kk=0; kk<data.data.Count; kk++)
{
List<string> mmm_mmm = data.data[kk];

for(ii=0; ii<mmm_mmm.Count; ii++)
{
Console.WriteLine(mmm_mmm[ii].ToString());
}
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

switch (m.Msg)
{
case WM_COPYDATA:
break;

default:
break;
}
}







/*
//JSON FORMAT

{
"teamname": "My Team",
"etc": "master group",
"members": [{
"name": "Mad Dog",
"age": 36,
"job": "Engineer",
"sex": "male",
}, {
"name": "Angry Bird",
"age": 30,
"job": "self-employment",
"sex": "female",
}]
}

json parsing - JsonConvert.DeserializeObject
json 문자열을 클래스로 바로 파싱을 하려면 JsonConvert 객체의 DeserializeObject 함수를 이용하면 됩니다.

json 변환 - JsonConvert.SerializeObject
클래스를 json 문자열로 변환할때는 JsonConvert의 SerializeObject 를 이용하면 됩니다.

string json = JsonConvert.SerializeObject(Teams, Formatting.None);
*/



using System;
using System.Linq;
using System.Collections.Generic;


#if(true)
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
#endif

class Program
{
public static void Main(string[] args)
{
DeserializeObjectManage nm = new DeserializeObjectManage();
nm.running();
}
}
class DeserializeObjectManage
{
public class clTeams
{
public string teamname;         //json 항목명과 동일해야함 (대소문자 구분)
public string etc;              //json 항목명과 동일해야함 (대소문자 구분)

public List<clMember> members;  //json 항목명과 동일해야함 (대소문자 구분)
}

public class clMember
{
public string name;
public int age;
public string job;
public string sex;
}

public void running()
{
string jsontext = "{ \"teamname\": \"My Team\", \"etc\": \"master group\", \"members\": [{ \"name\": \"Mad Dog\", \"age\": 36, \"job\": \"Engineer\", \"sex\": \"male\", }, { \"name\": \"Angry Bird\", \"age\": 30, \"job\": \"self-employment\", \"sex\": \"female\", }]}";

clTeams Teams; //선언해준 클래스

Teams = JsonConvert.DeserializeObject<clTeams>(jsontext);

Console.WriteLine(Teams.members.Count);

for (int kk = 0; kk < Teams.members.Count; kk++)
{
Console.WriteLine(Teams.members[kk].name);
Console.WriteLine(Teams.members[kk].age);
Console.WriteLine(Teams.members[kk].job);
Console.WriteLine(Teams.members[kk].sex);
}
}
}

/*
csc /reference:Newtonsoft.Json.Net20.dll /out:form_6.exe form_6.cs
csc /reference:Newtonsoft.Json.Net20.dll /out:form_6.exe form_6.cs
csc /reference:Newtonsoft.Json.Net20.dll /out:form_6.exe form_6.cs
*/

1. SendMessage.cs(Timer, Background)
- 데이타를 Title을 Handle로 잡아서, 송신한다.

2. ReceiveMessage.cs
- 데이타를 Title을 Handle로 잡아서, 수신한다.

send_msg.cs
0.01MB
send_msg_2.cs
0.01MB
recv_msg.cs
0.00MB

 

KEY POINT)주고 받는, 메세지의 길이가 명확해야 한다.

 

 

Newtonsoft.Json.Net20.dll 을 이용한 파싱 sample

 

form_2.cs
0.00MB

>>>REDIS 소개
REDIS는 BSD 라이센스 기반의 Key-value 캐쉬 & Store 소프트웨어다. 
String, hash, lists, sets, sorted set, bitmap, hyperloglogs 등 다양한 데이터 구조를 저장할 수 있기 때문에, 
data structure server라고 부르기도 한다.
메모리에 데이터를 쓰는 In memory 데이터베이스 그리고 NoSQL 데이터베이스로 분류된다. 
데이터에 대한 읽기와 쓰기가 많은 서비스에 사용 할 수 있다. 
Memcached와 비슷한 스팩을 가지고 있는데, 다양한 유형의 데이터를 지원한다는게 장점이다.

>>>Redis 자료구조 테스트
1.
Strings키에 대한 값으로 문자열(string)를 저장한다. 
단순한 타입으로, redis를 사용한다고 하면 가장 먼저 고려해볼만한 타입이다. 
JSON, XML등 문자열로 된 데이터들을 저장할 수 있다. 
웹 서비스를 한다면, HTML 문서의 전체 혹은 일부분을 캐쉬하기 위해서 사용할 수 있다.

SET을 이용해서 값을 저장하고, GET을 이용해서 값을 가져올 수 있다. 
이미 있는 key에 대해서 값을 설정하면, 값을 덮어쓴다.
특이한 점은 string이라고 해서 문자열만 저장하는게 아니고, 바이너리(binary) 데이터도 저장할 수 있다는 거다.

MSET과 MGET을 이용해서 한 번에 여러 개의 key, value를 저장하고 읽을 수 있다.

2.
리스트

LPUSH를 이용해서 리스트의 맨 앞(왼쪽-left)에, RPUSH를 이용해서 리스트의 맨 뒤에 값을 밀어넣을 수 있다. LRANGE로 일정 범위의 값을 읽을 수 있다.
LRANGE는 시작과 끝을 위한 두 개의 index 값이 필요하다. 인덱스가 마이너스(-)이면, 리스트의 끝(오른쪽)을 기준으로 인덱스 값을 메긴다. 
오른쪽 끝의 인덱스는 -1이다. 따라서 "0 -1"은 0번째 부터 마지막 까지의 범위를 의미한다.한번에 여러개의 값을 저장할 수도 있다.

KEY POINT>>>>
pop은 Redis list에서 가장 중요한 연산일 것이다. 이 연산은 리스트에서 값을 읽는게, 아니라 꺼낸다. 
읽으면서 지운다라고 생각하면 되겠다.
pop은 Redis list에서 가장 중요한 연산일 것이다. 이 연산은 리스트에서 값을 읽는게, 아니라 꺼낸다. 
읽으면서 지운다라고 생각하면 되겠다.
pop은 Redis list에서 가장 중요한 연산일 것이다. 이 연산은 리스트에서 값을 읽는게, 아니라 꺼낸다. 
읽으면서 지운다라고 생각하면 되겠다.
pop은 Redis list에서 가장 중요한 연산일 것이다. 이 연산은 리스트에서 값을 읽는게, 아니라 꺼낸다. 
읽으면서 지운다라고 생각하면 되겠다.
3.

Blocking operation on lists

REDIS는 list 데이터 타입에 대해서 Blocking operation을 지원한다.list로 부터 값을 꺼내기(POP)위한 가장 방법은 주기적으로 rpop를 호출하는 것이다. 
이 방식은 주기를 조절하는게 애매모호하기 때문에 그다지 좋아 보이지 않는다. 
POP을 호출하는 시점에 읽을 데이터가 없다면, 읽을 데이터가 준비될 때까지 blocking 되는게 깔끔해 보인다. 
한번의 호출로 데이터를 읽을 수 있기 때문이다.BRPOP과 BLPOP 명령을 이용하면, blocking 작업이 가능하다. 
이들 명령을 호출하면, 데이터가 없을 경우 데이터가 준비될 때까지 block된다. 물론 block 시간 설정도 가능하다.

+ Recent posts