Login After,,,,,,,,

Process.Start("APMCommManager.exe");

-APMCommManager.exe

Application.Run(new APMCommManagerForm()); //APMCommManager/Program.cs

public APMCommManagerForm() //APMCommManager/APMCommManagerForm.cs
{
    mainWindowHandle = (IntPtr)Convert.ToInt32( arguments[1] );
    APMApiPublic.PostMessage(Handle, APMApiPublic.UWM_APP_STARTUP, (IntPtr)0, (IntPtr)0 );
}

protected override void WndProc(ref Message m) //APMCommManager/APMCommManagerForm.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.UWM_APP_STARTUP:
        APMApiPublic.SendMessage(mainWindowHandle, APMApiPublic.UWM_APP_STARTUP, (intPtr)Handle, 
        (IntPtr)Process.GetCurrentProcess().id);
        break;
    }
}

-Basic Const Variables
protected override void WndProc(ref Message m) //APM/APMMain.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.UWM_APP_STARTUP:
        commHandle=APMMemory.GetInstance.APMCommManager=(IntPtr)m.WParam; 
        //public IntPtr APMCommManager
        break;
    }
}

- Form Button Query Click //APM/Screen/DBM/UAPDBMQ0010.cs
string query = string.Format(@"select * from table where flag = 1");
APMPublic.GetInstance.SendQuery(currentHandle, 2, 10, MetaData.APP_TYPE.QUERY.ToString(), query);

//APM/APMPublicLib/Common/APMPublic.cs
- SendQuery(IntPtr handle, int queryindex, int columnCnt, string clientMessageTarget, string query)
{
    string timestam[ = string.Format("{0:D10}.{1:D3}", Convert.ToInt64(handle.ToString()), queryindex);

    IntPtr result = APMapiPublic.send((IntPtr)MetaData.APP_TYPE_QUERY, APMMemory.GetInstance.APMCommManager, jsonstring);
    return result;
}

//APM/APMPublicLib/Common/APMPublic.cs
- public static IntPtr send(IntPtr wParam, IntPtr hWnd, byte[] data)
- public static IntPtr send(IntPtr wParam, IntPtr hWnd, string data)
{
    IntPtr result = SendMessage(hWnd, WM_COPYDATA, wParam, sendData);
    return result;
}

protected override void WndProc(ref Message m)//APM/APMCommManager/APMCommManagerForm.cs
{
    switch(m.Msg)
    {
        case APMApiPublic.WM_COPYDATA:
        if(m.WParam==(IntPtr)MetaData.APP_TYPE.QUERY) brea;
    }

    SendToTail() //SendMessage Log Record!!

    byte[] jsonByte = Encoding.UTF8.GetBytes(jsonstring);
    sendQueue.Enqueue(jsonByte); //입력한다.

    if( ! ____sendWorker.IsBusy) ____sendWorker.RunWorkerAsync();
}

void ____sendWorker_DoWork(object sender, DoWorkEventArgs e)//APM/APMCommManager/APMCommManagerForm.cs
{
    byte[] jsonByte=sendQueue.Dequeue(); //꺼낸다.
    resultcode=____sendRedis.RPush("QCS", jsonByte); //통신시에는 byte단위를 사용
}

//APM/APMCommManager/APMCommManagerForm.cs
void ____sendWorker_Completed(object sender, CompletedEventArgs e)
{
    if(____sendQuquq.Count > 0)
        if(! ____sendWorker.IsBusy) ____sendWorker.RunWorkerAsync();
}




'c# 언어 > 기타' 카테고리의 다른 글

Application.Perfomance.Management(Receiving by Redis)  (0) 2022.01.14

/*
* C# - 마샬링이란(Marshalling)
* C# - 마샬링이란(Marshalling)
*/

1. 마샬링이란?

마샬링이란 한 객체의 메모리에서의 표현방식을 저장 또한 전송에 적합한 다른 데이터 형식으로 변환하는 과정입니다.
이는 데이터를 서로 다른 프로그램간에 전달할 필요가 있을 경우 사용합니다.
즉, 이는 직렬화와 유사하며 직렬화된 한 객체로, 멀리 떨어진 객체와 통신하기 위해 사용합니다.
이렇듯 복잡한 통신을 단순화하여 쉽게 데이터를 주고받을 수 있도록 해주는 것이 마샬링 입니다.

2. 프로그래밍에서의 마샬링

클라이언트가 서로 다른 프로세스, 원격지의 메서드를 호출해야한다고 가정합시다.
서버에 넘겨지는 인자, 리턴 값들을 프로그래밍 인터페이스에 맞도록 데이터를 조직화하고, 미리 정해진 다른 형식으로 변환합니다. 이것이 프로그래밍에서의 마샬링 입니다.
이는 XML로의 마샬링, Byte 스트림으로의 마샬링 등 다양한 방법이 있는데
이처럼 데이터 교환시 어떠한 정해진 표준에 맞게 해당 데이터를 가공하는 것이 마샬링이라면, 
가공된 데이터를 원격지에서 사용하기위한 과정을 언마샬링 이라고 합니다.

마살링도 참조 마샬링과 값 마샬링으로 구분할 수 있습니다.

참조 마샬링(MBR): MarshalByRefObject 를 상속
- 객체의 메모리를 통째로 저장한 후 다른 머신에서 객체를 복원해서 사용하는 기술
값 마샬링(MBV): Serializable Attribute를 지정하거나 ISerializable 인터페이스를 구현
- 참조 마샬링이란 객체를 핸들하기 위한 정보만을 묶어서 넘긴 후 그 정보를 이용해서 원격으로 객체를 핸들하는 기술

3. 결론

클라이언트에서 마샬링된 데이터를 서버나 다른 프로세스에 전달하게 되면, 
그 원격지에서는 데이터를 받아 언마샬링하여 사용함으로써 상호간의 통신하며 데이터를 사용할 수 있습니다.
이전 포스팅에서 프로세스 통신에 대해 소개한 적이 있는데, 
그 예제에서 사용했던 것이 바로 바이트 스트림으로의 마샬링 입니다.

Send    : string(Query) -> byte
Receive : byte -> string -> json(Data)

        public static void SendRedisDoWork(object sender, DoWorkEventArgs e)
        {
            string hostName = System.Environment.MachineName + "." +
               Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
                   "SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters").GetValue("Domain", "").ToString();

            RedisClient rc = new RedisClient(parms.Host, parms.Port);

            for (int i = 0; i < parms.NumMessages; i++)
            {
                JObject o = new JObject
                {
                    {"Application", "redis-generator"},
                    {"Host", hostName},
                    {"UtcTimestamp", DateTime.UtcNow.ToString("o")},
                    {"Type", "redis"},
                    {"Message", "redis message " + DateTime.UtcNow.ToString("o")},
                    {"Index", "logstash"}
                };
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(o.ToString());

                int restult = rc.RPush("QCS", bytes);
            }
        }

using System;

class Program
{
public static void Main()
{
int kk;
string str = "QUERY.0123456789.001";

string[] split = str.Split('.');

for(kk=0; kk<split.Length; kk++)
{
Console.WriteLine(">>>>[" + kk.ToString("0000") + "]:" + split[0] + "/" + split[1] + "/" + split[2]);
}
}
}

/*-------------------------------------------------------
>>>>[0000]:QUERY/0123456789/001
>>>>[0001]:QUERY/0123456789/001
>>>>[0002]:QUERY/0123456789/001
-------------------------------------------------------*/


using System;

class Program
{
static void Main()
{
String str = "1234";

Console.WriteLine(">" + "1234567890");
Console.WriteLine(">" + string.Format("{0:D10}", Convert.ToInt64(str)));
}
}

/*RESULT--------------------------------------
>1234567890
>0000001234
---------------------------------------------*/

1) NetWork Application(for example, APM)
Linux Server Program - C Language
Windows Client Program - C# Language(Visual Studio)

2) Web
Linux Server - tomcat(by java beans & jsp)
Client - Web Browser(IE,Chrome)

3) StandAlone Window Application
- C# Language(Visual Studio)

4) Batch Application IN MySQL 
- C Language

5) Console Apllication In Windows
- C Language
- C# Language
- JAVA Language

6) Javascript Program In WebBrowser
- Javascript Language, Java Server Page, Java Beans
- HTML/CSS

 

TRIS MECHANISM,,,,,,,,

>>>>MAPY=10
>>>>MAPX=10
>>>>ARR=4
>>>>DESIGN[ARR,ARR]={{1,1,1,1},{1,0,0,0},{1,0,0,0},{1,0,0,0}};
>>>>TRIS[MAPY,MAPX]
>>>>xpos=1
>>>>ypos=0
>>>>score=0

 

1 1 1 1 1 0 0 0 0 1
1 1 0 0 0 0 0 0 0 1
1 1 0 0 0 0 0 0 0 1
1 1 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1


1. TIME EVENT (?) - c# ElapsedEventHandler()
2. KEY EVENT (?) - c# ConsoleKeyInfo Structure
3. CHECK LOGIC (?) - Common Logic


000001) 


1.  swap(2,048)  -> 10,000
2.  /boot(100)   ->  2,000(첫번째 파티션으로 만듦, 체크)
3.  /(3,072)     -> 12,000
4.  /usr(8,192)  -> 70,000
5.  /usr2(90,000)-> 90,000                               -> 120,000
6.  /var(4,096)  -> 12,000
7.  /tmp(4,096)  -> 12,000
8.  /data(70,000)-> 70,000
9.  /home(2,000) ->  2,000
10. /web(나머지 부분을 할당, 체크)

000001) Telnet
sudo apt-get install telnetd xinetd -y

service telnet
{
    disable         = no
    flags           = REUSE
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/sbin/in.telnetd
    log_on_failure  += USERID
}

sudo /etc/init.d/xinetd restart

00004)
by root
mkdir /usr2/sinfo

00005)
groupadd other
useradd -d /usr2/sinfo -g other -s /bin/bash sinfo
passwd sinfo

00006)
cd /usr2
chown -R sinfo:other sinfo

00007)
apt update -y
apt-get install vsftpd

>>vsftpd.conf 파일 수정
vi /etc/vsftpd.conf
# Uncomment this to enable any form of FTP write command.
write enable=YES

>>vsftpd 서비스 재시작
/etc/init.d/vsftpd restart

00008)

apt-get update

apt-get install make
apt-get install gcc
apt-get install g++ 
apt-get install net-tools
apt-get install curl
apt install pkg-config

apt-get install cmake
apt-get install libssl-dev
apt-get install libexpat1-dev
apt-get install libboost-all-dev
apt-get install libncurses5-dev libncursesw5-dev

1. MySQL 다운로드 (경로: /usr/local)
$ cd /usr/local
$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.25.tar.gz
$ tar xvfz mysql-8.0.25.tar.gz

$ cd /usr/local/src/
$ wget https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.gz
$ tar xvfz boost_1_73_0.tar.gz

2.설치
$ cd /usr/local/mysql-8.0.25
$ rm -f CMakeCache.txt
$ mkdir tmp_mysql(USER ADD DIRECTORY)
$ cd tmp_mysql(USER ADD DIRECTORY)
$ cmake \
.. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DSYSCONFDIR=/etc \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/src/boost_1_73_0
$ make
$ make install

3.MySQL DB 초기화
(1)그룹 지정

$ groupadd mysql
$ useradd -r -g mysql -s /bin/false mysql
그룹과 유저를 만들어야 한다.

-r : system account
-g : 그룹 지정
-s : user의 로그인 shell

(2) 디렉토리 생성

$ cd /usr/local/mysql
$ mkdir mysql-files
편한 이름의 디렉토리를 만들어 준다.

(3)권한주기

$ chown -R mysql:mysql /usr/local/mysql
$ chown mysql:mysql mysql-files
$ chmod 750 mysql-files
chown: 파일의 소유자를 변경

-R : 하위 디렉토리까지 소유권 할당

chmod : 사용권한을 변경

(4)기본 DB 생성

$ bin/mysqld --initialize --user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

임시비밀번호가 나온다.
이 비밀번호는 나중에 써야하니 잘 기억해두자!
root@localhost : hYyR#f#D1ZCb

아래 명령어로 mysql로 전환한다.

$ bin/mysql -u root -p
명령어를 치면 비밀번호를 입력하게 되는데 아까 받은 초기 비밀번호를 입력하면 된다.

(2) 비밀번호 할당하기

mysql>alter user 'root'@'localhost' identified by '원하는 비밀번호';
mysql>flush privileges;
mysql>commit;

(3) 서버 종료


이때 비밀번호가 잘 변경됬는지 확인하면 된다.

5.MySQL 서비스 등록
서비스를 등록하면 서버가 실행되었을 때, mysql 이 자동으로 실행된다.

mysqld 파일을 복사한다.

$ sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
mysqld 파일을 열어서 basedir 와 datadir 를 설정한다.

$ sudo vi /etc/init.d/mysqld


basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
mysqld 서비스를 등록한다.

$ update-rc.d mysqld defaults
reboot로 다시 시작한 뒤 보면 서버시작 안 해도 서버 시작이 되어있음을 확인할 수 있다.

$ reboot 
$ ps -ef | grep mysqld

/*----------------------------------------------------------*/



create database stockDB;
flush privileges;


백업)
/usr/local/mysql/bin/mysqldump -u root -p mysql > mysql_db.sql
(mysql>root계정까지 백업되므로, root패스워드가 원복시에 바뀌어버린다. 주의해야 한다.)
(mysql>root계정까지 백업되므로, root패스워드가 원복시에 바뀌어버린다. 주의해야 한다.)

원복)
/usr/local/mysql/bin/mysql -u root -p mysql < mysql_db.sql
(mysql>root계정까지 백업되므로, root패스워드가 원복시에 바뀌어버린다. 주의해야 한다.)
/usr/local/mysql/bin/mysql -u root -p stockDB < stockDB_db.sql

Install gcc downgrade)
add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty main'
add-apt-repository 'deb http://archive.ubuntu.com/ubuntu/ trusty universe'
apt install gcc-4.7 g++-4.7 -y

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 10

비고)
update-alternatives --config gcc
update-alternatives --config g++

Compile)

root@stock:~# gcc --version
gcc (Ubuntu/Linaro 4.7.3-12ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@stock:~#

PATH설정)

sinfo@stock:~/exe$ ./Batch
./Batch: error while loading shared libraries: libmysqlclient.so.21: cannot open shared object file: No such file or directory
sinfo@stock:~/exe$
sinfo@stock:~/exe$


root@stock:/usr/local# find ./ -name libmysqlclient.so.21
./mysql/lib/libmysqlclient.so.21
root@stock:/usr/local#

즉 /usr/local/mysql/lib 디렉토리를 /etc/profile에 추가시켜주면 됩니다. 혹은 개인계정 profile에 추가해도 무방

# vi /etc/profile
export LD_LIBRARY_PATH=/usr/local/mysql/lib/:LD_LIBRARY_PATH

100_partition_user_add_info.txt
0.00MB
110_install_make_succ.txt
0.00MB

 

this.Text = "베트남어: Ti?ng Thai"; 를 이용한 

SendMessage[WM_COPYDATA] 는 실패!!

만국공통어인 영어를 사용해서 FindWindow를 실행해야 할것 같음.


using System;
using System.Windows.Forms;
using System.Text;
using System.Runtime.InteropServices;


namespace RecvPackage
{
public class Program : Form
{
public const int WM_COPYDATA=0x004A;

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

public Program()
{
//From FindWindow(), This Application is Detected!!
//From FindWindow(), This Application is Detected!! //The KeyWord is Below String,,,,,
this.Text = "RecvSendDataMonitoring";
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
try
{
switch(m.Msg)
{
case WM_COPYDATA :
COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
byte[] recvData = new byte[cds.cbData];
Marshal.Copy(cds.lpData, recvData, 0, cds.cbData);
Console.WriteLine(Encoding.Default.GetString(recvData));

break;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}

public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Program());
}
}//end of class
}//end of namespace

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WinTrisEx01
{
public partial class Form1 : Form
{
public const int WM_COPYDATA = 0x004A;

int xpos=0;

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

IntPtr tailHandle = IntPtr.Zero;

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

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
SendToTail(1, ">>>>SendData:[" + xpos.ToString("00000") + "]");
xpos++;
}

private void SendToTail(int index, string data)
{
tailHandle = FindWindow(null, "RecvSendDataMonitoring");
try
{
byte[] dataByte = Encoding.UTF8.GetBytes(data);

COPYDATASTRUCT copyData = new COPYDATASTRUCT();
copyData.dwData = (IntPtr)0;
copyData.cbData = data.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, WM_COPYDATA, (IntPtr)index, sendData);

Marshal.FreeHGlobal(copyData.lpData);
Marshal.FreeHGlobal(sendData);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}
}
}

/*
 * From BackgroundWorker 매카니즘
 */

1. 서버로 data 송신시 -> SendWorker
2. 서버에서 data 수신시 -> RecvWorker
3. Queue에 데이타 입력시 -> SendQueue
4. Queue에 데이타 출력시 -> RecvQueue
5. 출력되어진 데이타를 Grid에 Display시 -> RecvQueue

From BackgroundWorker, 업무를 처리하는 동안, 어떤 방해도 받지 않는다.

/*
* From Process To Process, Message Send,Recv
*/

namespace RecvPackage
{
    public class Program : Form
    {
        public const int WM_COPYDATA=0x004A;

        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int dbData;
            public IntPtr lpData;
        }

        public Program()
        {
            //From FindWindow(), This Application is Detected!!
            //From FindWindow(), This Application is Detected!! //The KeyWord is Below String,,,,,
            this.Text = "RecvSendDataMonitoring";
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            try
            {
                switch(m.Msg)
                {
                    case WM_COPYDATA :
                    COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
                    byte[] recvData = new byte[cds.cbData];
                    Marshal.Copy(cds.lpData, recvData, 0, cds.cbData);
                    Console.WriteLine(Encoding.Default.GetString(recvData));

                    break;
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Program());
        }
    }//end of class
}//end of namespace

            

/*
BackgroundWorker를 통해 조금 더 안전하게 이벤트 기반으로 비동기 처리를 진행하는 패턴 사용해보기 (RunWorkerAsync, IsBusy)

BackgroundWorker를 통해 조금 더 안전하게 이벤트 기반으로 비동기 처리를 진행하는 패턴 사용해보기 (RunWorkerAsync, IsBusy)

BackgroundWorker를 통해 조금 더 안전하게 이벤트 기반으로 비동기 처리를 진행하는 패턴 사용해보기 (RunWorkerAsync, IsBusy)

BackgroundWorker를 통해 조금 더 안전하게 이벤트 기반으로 비동기 처리를 진행하는 패턴 사용해보기 (RunWorkerAsync, IsBusy)
*/

1. ".." 은 현재 실행되는 모습이다. 예를 들어 마우스를 움직인다던지, 키보드를 사용한다던지, 어떤 행위를 하는
2. 메세지는 백그라운드로 실행되는 행위의 모습이다. 예을 들어 서버와의 통신, 프로그래스바 등이 움직이는
행위를 연출할수 있다.
클라이언트와 서버와의 통신시에 자유롭게 마우스나 키보드나 행위를 할수 있어야 한다.
프로그래스바가 움직이는동안에서 마우스나 키보드나 행위를 할수 있어야 한다.
이런모습을 100에서 9999까지의 숫자중에 프라임넘버가 몇개인지 COUNT하는 TASK를 텍스트로 표현해보았다.
Console.WriteLine(">>>>>>Long running task start!!");
Console.WriteLine(">>>>>>Prime Number Cnt:[" + cnt.ToString("0000") + "]");
Console.WriteLine(">>>>>>Long running task end!!");
Console.WriteLine(">>>>>>Long running task completed!!");

3. 실제소스코드이다. 위를 표현한,ㅡㅡㅡㅡㅡ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
 
namespace TrisPackage.Tris
{
    class Program
    {
        static void Main(string[] args)
        {
            BackgroundWorkerCls bwt = new BackgroundWorkerCls();
 
            while(true)
            {
                bwt.Execute();
            }
        }
    }
 
    class BackgroundWorkerCls
    {
        private BackgroundWorker worker;
 
        public BackgroundWorkerCls()
        {
            worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        }
        ~BackgroundWorkerCls()
        {
            worker.DoWork -= new DoWorkEventHandler(worker_DoWork);
        }
 
        public void Execute()
        {
            Console.Write("..");
 
            // InvalidOperationException Protection!!
            // InvalidOperationException Protection!!
            if(!worker.IsBusy) worker.RunWorkerAsync();
        }
 
        //Work Thread Execute Task Method
        //Work Thread Execute Task Method
        //Work Thread Execute Task Method
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            Console.WriteLine("");
            Console.WriteLine(">>>>>>Long running task start!!");

            int ii,kk,ff,prime,cnt=0;

            for(ii=100; ii < 9999; ii++)
            {
                prime = ii;
                ff = 0;
                for(kk=1; kk <= prime; kk++)
                {
                        if(prime / kk * kk == prime) ff++;
                }

                if(ff == 2) cnt++;
             }
             Console.WriteLine("");
             Console.WriteLine(">>>>>>Prime Number Cnt:[" + cnt.ToString("0000") + "]");
             Console.WriteLine("");
             Console.WriteLine(">>>>>>Long running task end!!");
             Console.WriteLine("");
        }

        //Work Thread Execute Task Method
        //Work Thread Execute Task Method
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
                Console.WriteLine("");
                Console.WriteLine(">>>>>>Long running task completed!!");
                Console.WriteLine("");
        }
    }
}

 

결론적으로 위의 이미지에서 보이는 .....은 평상시에 우리가 화면을 핸들링하는 모습이고, 나머지의 메세지는 백그라운드를 통해서 이루어지는, 즉 비동기적으로 안보이는 작업들이 행해지는 모습을 나타낸것입니다.

[C언어] 변수 단위 파일 읽기 함수 - fscanf


※요약
fscanf : 개방된 파일에서 변수 단위로 입력을 받는다.

※특징
변수 간의 구분은 공백, 탭, 개행 문자로 한다.
*는 값을 읽지 않고 건너뛸 때 사용한다.
파일 포인터는 자동으로 증가한다.

※함수 원형 및 설명
int fscanf( FILE *stream, const char *format [, argument].. );
----- stream : 개방된 FILE 구조체의 포인터
----- format : 형식 제어 문자열
----- argument : 가변적인 매개변수
----- 반환값 : 읽혀진 필드의 수. 파일 끝 또는 에러 시 EOF(-1)

#include <stdio.h>

int main( )
{
FILE *pFile = NULL;

pFile = fopen( "d:\\Text.txt", "r" );
if( pFile == NULL )
{
//에러 처리
}
else
{
int nCount;
float fRatio;
char strDesc[255];

while( !feof( pFile ) )
{
//공백으로 분리된 파일 읽기
fscanf( pFile, "%d %f %s", &nCount, &fRatio, strDesc );
printf( "공백으로 분리 : %d %f %s\n", nCount, fRatio, strDesc );

//,로 분리된 파일 읽기
fscanf( pFile, "%d, %f, %s", &nCount, &fRatio, strDesc );
printf( ",로 분리 : %d, %f, %s\n", nCount, fRatio, strDesc );

//탭으로 분리된 파일 읽기
fscanf( pFile, "%d\t%f\t%s", &nCount, &fRatio, strDesc );
printf( "탭으로 분리 : %d\t%f\t%s\n", nCount, fRatio, strDesc );

//선별적으로 읽기 - [%*]을 사용하면 값을 읽지 않는다.
fscanf( pFile, "%*d %*f %s\n", strDesc );
printf( "선별적으로 읽기 : %s\n", strDesc );
}

fclose( pFile );
}

return 0;
}

C# 개요(Introduction)

C#은 C++의 컴퓨팅 파워와(1) 비주얼 베이직의 편리함(2)을 하나로 합치기 위해 마이크로소프트사(MS)에서 개발한 새로운 객체 지향 프로그래밍 언어입니다.

C#은 C++의 컴퓨팅 파워와 비주얼 베이직의 편리함을 하나로 합치기 위해 마이크로소프트사(MS)에서 개발한 새로운 객체 지향 프로그래밍 언어입니다.

C#은 C++의 컴퓨팅 파워와 비주얼 베이직의 편리함을 하나로 합치기 위해 마이크로소프트사(MS)에서 개발한 새로운 객체 지향 프로그래밍 언어입니다.

C#은 C++의 컴퓨팅 파워와 비주얼 베이직의 편리함을 하나로 합치기 위해 마이크로소프트사(MS)에서 개발한 새로운 객체 지향 프로그래밍 언어입니다.

C#은 C++의 컴퓨팅 파워와 비주얼 베이직의 편리함을 하나로 합치기 위해 마이크로소프트사(MS)에서 개발한 새로운 객체 지향 프로그래밍 언어입니다.

/*
C# 언어 대리자 개념은 최고 수준의 언어 지원 및 해당 개념 관련 형식 안정성을 제공합니다.
함수 포인터는 호출 규칙을 더욱 세부적으로 제어해야 하는 유사한 시나리오용으로 C# 9에 추가되었습니다. 
대리자와 연결된 코드는 대리자 형식에 추가된 가상 메서드를 사용하여 호출됩니다.
*/

/*----------------------------------------------------------------------------------
>>대리자

1.  ElapsedEventHandler 대리자
1.1 public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);

>>대리자 호출

1.  Timer.Elapsed 이벤트
1.1 public event System.Timers.ElapsedEventHandler Elapsed;
----------------------------------------------------------------------------------*/


c# 객체지향 언어이긴 하지만 함수지향형 언어가 갖는 특징을 갖기도 합니다.
이를테면 c언어의 함수 포인터에 해당하는 기능이 c#에도 있다는 겁니다.
오히려, c언어의 함수포인터보다 기능이 더 강화되었습니다.

1. 대리자(Delegate)

c# 초기 버젼부터 있던 기능입니다. c언어의 함수포인터를 그대로 차용한거나 다름없습니다.
메소드의 위치를 간직하고 있으면서, 그 메서드를 실행해 주는 역할을 합니다.

Ex)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TEST
{
class Program
{
delegate void DelegateMethod(int a);

static void method1(int a){Console.WriteLine("method1 called!! a = {0}", ++a);}
static void method2(int a){Console.WriteLine("method2 called!! a = {0}", ++a);}
static void method3(int a){Console.WriteLine("method3 called!! a = {0}", ++a);}
static void method4(int a){Console.WriteLine("method4 called!! a = {0}", ++a);}
static void method5(int a){Console.WriteLine("method5 called!! a = {0}", ++a);}
static void method6(int a){Console.WriteLine("method6 called!! a = {0}", ++a);}
static void method7(int a){Console.WriteLine("method7 called!! a = {0}", ++a);}
static void method8(int a){Console.WriteLine("method8 called!! a = {0}", ++a);}
static void method9(int a){Console.WriteLine("method9 called!! a = {0}", ++a);}

static void Main()
{
DelegateMethod method = null;

method += method1;
method += method2;
method += method3;
method += method4;
method += method5;
method += method6;
method += method7;
method += method8;
method += method9;

method(0);
}
}
}


결과) 동시에 실행이 된다고 볼수 있다. a의 값을 주목

D:\tmp\console>sample.exe
method1 called!! a = 1
method2 called!! a = 1
method3 called!! a = 1
method4 called!! a = 1
method5 called!! a = 1
method6 called!! a = 1
method7 called!! a = 1
method8 called!! a = 1
method9 called!! a = 1
D:\tmp\console>

/*Handler
- DoWorkEventHandler
- RunWorkerCompletedEventHandler
*/
using System.ComponentModel

 

System.ComponentModel 네임스페이스

구성 요소와 컨트롤의 런타임 및 디자인 타임 동작을 구현하는 데 사용되는 클래스를 제공합니다. Provides classes that are used to implement the run-time and design-time behavior of components and controls. 이 네임스

docs.microsoft.com

class TrisCls
{
     int xpos,ypos;
     BackgroundWorker sendWork;

    public void running()
    {
        ConsoleKeyInfo keyinfo;

        init();
        while(true)
        {
            //add
        }
    }
    void init()
    {
        xpos=ypos=0;
       
        sendWorker = new BackgroundWorker();
        sendWorker.DoWork += new DoWorkEventHandler(sendWorker_DoWork);
        sendWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(sendWorker_RunWorkerCompleted);
    }
    void DoWorkEventHandler(object sender, DoWorkEventArgs e)
    {
         Console.WriteLine("DoWorkEventHandler>>" + xpos.ToString("0000") );
         xpos++;
    }
    void sendWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Console.WriteLine("sendWorker_RunWorkerCompleted>>" + ypos.ToString("0000") );
        ypos++;
    }
}

int exchange_check()
{
int ii,kk,ff,tmp;
int[,] tristmp = new int[MAPY,MAPX];
int[,] designtmp = new int[ARR,ARR];

for(ii=0; ii<MAPY; ii++)
for(kk=0; kk<MAPX; kk++)
{
tristmp[ii,kk]=tris[ii,kk];
}

for(ii=0; ii<ARR; ii++)
for(kk=0; kk<ARR; kk++)
{
designtmp[ii,kk]=design[ii,kk];
}

for(ii=0; ii<ARR; ii++)
for(kk=0; kk<ARR; kk++)
{
if(ypos+ii>MAPY-1) continue;
if(xpos+kk>MAPX-1) continue;
if(xpos+kk<0) continue;

if(designtmp[ii,kk]==1) tristmp[ypos+ii,xpos+kk]=0;
}

//exchange//exchange//exchange//exchange//exchange
//exchange//exchange//exchange//exchange//exchange
//exchange//exchange//exchange//exchange//exchange
//exchange//exchange//exchange//exchange//exchange

/*
{0,0},{0,1},{0,2},{0,3},
{1,0},{1,1},{1,2},{1,3},
{2,0},{2,1},{2,2},{2,3},
{3,0},{3,1},{3,2},{3,3},
*/

for(ii=0; ii<3; ii++)
{
//add
}
tmp=designtmp[1,1];
designtmp[1,1]=designtmp[1,2];
designtmp[1,2]=designtmp[2,2];
designtmp[2,2]=designtmp[2,1];
designtmp[2,1]=tmp;

for(ii=0; ii<ARR; ii++)
for(kk=0; kk<ARR; kk++)
{
if(ypos+ii>MAPY-1) continue;
if(xpos+kk>MAPX-1) continue;
if(xpos+kk<0) continue;

if(designtmp[ii,kk]==1) tristmp[ypos+ii,xpos+kk] += 1;
}

ff=0;
for(ii=0; ii<ARR; ii++)
for(kk=0; kk<ARR; kk++)
{
if(ypos+ii>MAPY-1) continue;
if(xpos+kk>MAPX-1) continue;
if(xpos+kk<0) continue;

if(tristmp[ypos+ii,xpos+kk] > 1) ff++;
}

if(ff > 0)
{
return(FAIL);
}
else
{
for(ii=0; ii<MAPY; ii++)
for(kk=0; kk<MAPX; kk++)
{
tris[ii,kk]=tristmp[ii,kk];
}

for(ii=0; ii<ARR; ii++)
for(kk=0; kk<ARR; kk++)
{
design[ii,kk]=designtmp[ii,kk];
}
}
return(SUCC);
}

 

통합 개발 환경(Integrated Development Environment, IDE)이란 
공통된 개발자 툴을 하나의 그래픽 사용자 인터페이스(Graphical User Interface, GUI)로 
결합하는 애플리케이션을 구축하기 위한 소프트웨어입니다.

DELPHI IDE(sample)
- Language : Pascal

 

C# IDE = Visual Studio(Windows)
- Language : c#

IDE없이, notepad에서 코드를 작성한후에, 실행파일을 만들수도 있다.
IDE없이, notepad에서 코드를 작성한후에, 실행파일을 만들수도 있다.

C#

[요약] C++(시플러스플러스)에 기본을 두고, 비주얼베이직(visual basic)의 편의성을 결합하여 만든 객체지향 프로그래밍언어이다.

모든 것을 객체로 취급하는 컴포넌트 프로그래밍언어로, 시샵(C-sharp)이라고 발음한다. 2000년 6월 마이크로소프트가 닷넷(.NET) 폴랫폼을 위해 개발하였다. C++(시플러스플러스)에 기본을 둔 언어로, 비주얼베이직이나 자바(Java)와도 비슷하다. 따라서 비주얼베이직과 자바·C++ 등의 장점을 지닌다. 곧 비주얼 언어가 가진 사용자 친화성, C++의 객체지향성, 자바의 분산환경처리에 적합한 다중성 등을 모두 지니는 컴포넌트 기반의 소프트웨어 개발 패러다임을 반영한다.

웹을 통해 정보와 서비스를 교환하고, 개발자들이 이식성(portability) 높은 응용프로그램들을 만들어 낼 수 있게 고안되었다. 즉, 이 프로그래밍언어를 사용하면 대대적인 개정 없이도 하나 이상의 OS(운영체제)에서 사용될 수 있는 응용프로그램들을 만들어낼 수가 있다. 따라서 프로그래머가 별도의 코드를 만들지 않고서도 새로운 제품이나 서비스를 빠르고 값싸게 시장에 내놓을 수 있게 된다.

[네이버 지식백과] C# [C-sharp] (두산백과)

Added knowledge--------------------------------
Cross Platform
Whether you're working in C#, F#, or Visual Basic, your code will run natively on any compatible OS. Different 
.NET implementations handle the heavy lifting for you:

1) .NET is a cross-platform .NET implementation for websites, servers, and console apps on Windows, Linux, and macOS.
2) .NET Framework supports websites, services, desktop apps, and more on Windows.
3) Xamarin/Mono is a .NET implementation for running apps on all the major mobile operating systems.

'테트리스' 카테고리의 다른 글

C#, Tettris :: check_horizon routine()  (0) 2022.08.31
tris::common_chek(int direction)::final  (0) 2022.04.18
테트리스 개발코드관련  (0) 2021.04.16

+ Recent posts