2017. 11. 14. 00:24ㆍProgramming/VB.net
안녕하세요! Nitro입니다.
오늘은 프로그래밍에 꽤나 도움이 되는 지식을 들고 왔습니다.
바로 프로세스간 통신(IPC)방법인데요!
여러분들이 프로그램을 제작하다 보면, 프로그램과 프로그램이 통신해야하는 경우가 생길 수 있습니다.
하지만, 아무리 프로그램 1에서 A 라는 변수를 Public으로 선언해도, 프로그램 2에서는 A 라는 변수에 접근이 불가능합니다.
이는 서로 다른 프로세스들이 서로의 메모리 영역을 침법하여 발생하는 오류를 차단하기 위함으로 알고 있습니다.
그렇다면 위에서 언급했던것처럼, 프로그램이 서로 통신해야 할때는 어떻게 해야할까요?
몇몇의 사람들은 IPC의 존제를 모르고, 프로그램끼리 서로 서버 구축을 통하여 통신합니다.
하지만 IPC를 알게되면, 딱히 서버구축도 필요없고, 단 29줄의 소스코드면 손쉽게 공유할 수 있습니다.
마치 Form1과 Form2에서 사이로 공유된 변수(Public변수)가 있어서 통신이 되는것처럼,
프로그램 1과 프로그램 2가 서로 특정한 값을 공유하는것이죠.
(오타가 있습니다. 맵핑이 아니라 매핑인듯 합니다.)
이렇게 호출할 이름(매핑할 이름)을 적고, 내용을 적어준다음.
매핑된 이름을 불러오면, 저장된 내용이 출력됩니다.
개쩌는 부분은 이곳입니다!
바로 프로그램 1에서 적어놓은 IPC-Text라는 매핑을 프로그램 2 에서 호출할 수 있습니다.
요런식으로 서로 통신하게 되는것입니다.
소스코드를 작성하는 도중, 정리가 잘 되어있는 블로그를 찾아 그 블로그에서 소스코드를 가져왔습니다.
오류가 있었기에 추가와 수정을 하였습니다.
아레부터는 소스코드입니다.
[쓰기 부분]
Public Sub MakeMemoryMappedFile(ByVal target As String, ByVal tarText As String) Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize) Dim bytes = New Byte() {} bytes = StrToByteArray(tarText) Using writer = File.CreateViewAccessor(0, bytes.Length) writer.WriteArray(0, bytes, 0, bytes.Length) End Using End Sub
[읽기 부분]
Public Function ReadMemoryMappedFile(ByVal tarMem As String) As String Dim result As String = "" Try Using file = MemoryMappedFile.OpenExisting(tarMem) Using reader = file.CreateViewAccessor(0, MaxSize) Dim bytes = New Byte(MaxSize) {} reader.ReadArray(0, bytes, 0, bytes.Length) result = System.Text.Encoding.UTF8.GetString(bytes) End Using End Using Return result Catch Ex As Exception Return result End Try End Function
[누락된 부분]
(참고했던 블로그에서 누락되었던 부분입니다.)
Public Function StrToByteArray(ByVal str As String) As Byte() Dim encoding As New Text.UTF8Encoding() Return encoding.GetBytes(str) End Function
[쓰기 부분 사용법]
MakeMemoryMappedFile(매핑할 이름, 내용)
[읽기 부분 사용법]
MsgBox(ReadMemoryMappedFile(매핑된 이름)
[총 소스코드]
Imports System.IO.MemoryMappedFiles Public Class Form1 Dim MaxSize As String = 10000 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MakeMemoryMappedFile(TextBox1.Text, TextBox2.Text) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click MsgBox(ReadMemoryMappedFile(TextBox3.Text)) End Sub Public Sub MakeMemoryMappedFile(ByVal target As String, ByVal tarText As String) Dim File = MemoryMappedFile.CreateOrOpen(target, MaxSize) Dim bytes = New Byte() {} bytes = StrToByteArray(tarText) Using writer = File.CreateViewAccessor(0, bytes.Length) writer.WriteArray(0, bytes, 0, bytes.Length) End Using End Sub Public Function ReadMemoryMappedFile(ByVal tarMem As String) As String Dim result As String = "" Try Using file = MemoryMappedFile.OpenExisting(tarMem) Using reader = file.CreateViewAccessor(0, MaxSize) Dim bytes = New Byte(MaxSize) {} reader.ReadArray(0, bytes, 0, bytes.Length) result = System.Text.Encoding.UTF8.GetString(bytes) End Using End Using Return result Catch Ex As Exception Return result End Try End Function Public Function StrToByteArray(ByVal str As String) As Byte() Dim encoding As New Text.UTF8Encoding() Return encoding.GetBytes(str) End Function End Class
[참고]
https://msdn.microsoft.com/ko-kr/library/dd997372(v=vs.110).aspx
'Programming > VB.net' 카테고리의 다른 글
[vb.net]마우스 Form 이동과 곡면 태두리 만들기! (0) | 2018.12.18 |
---|---|
[Python]Object Detection with TensorFlow API. (0) | 2018.06.15 |
[VB.net]네이버 클로바 음성 합성 기술 API 사용법 (Clova Speech Synthesis : CSS) (4) | 2017.11.15 |
[VB.net]Emgu CV를 이용한 이미지속 글자찾기! (2) | 2017.10.18 |
[VB.net]스크린샷을 찍어보자! (1) | 2017.10.11 |