BLOG main image
분류 전체보기 (68)
excel.101 (0)
rewind (9)
(3)
(2)
목공 (3)
(3)
me2day (0)
The Ethereal Void (9)
코드 (14)
귀찮은것 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'코드'에 해당되는 글 14건
2007. 8. 29. 09:36
간혹가다 두 개의 독립된 Process간의 통신이 필요한 경우가 있다. 기본적으로 .NET Remoting을 통해 구현을 할수도 있겠지만, 좀 더 간단한 구현을 원할 경우에는 Process 클래스에서 제공하는 표준 입출력 Redirection을 통해 두 개의 프로세스간에 메세지를 교환할 수 있다.

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "Program.exe";
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;

Process TargetProgram = new Process();
TargetProgram StartInfo = psi;
TargetProgram.OutputDataReceived += 
new DataReceivedEventHandler(TargetProgram_OutputDataReceived);

TargetProgram.Start();

//대상 프로세스의 표출 출력을 읽어들인다.
TargetProgram.BeginOutputReadLine();

void TargetProgram_OutputDataReceived(object sender, DataReceivedEventArgs e)
{    
    if (!String.IsNullOrEmpty(e.Data))
    {
         Console.WriteLine(e.Data);
    }
}
// "Program.exe"
Console.WriteLine("Hello :)");
반대의 경우로 송신을 원할 경우에는 대상의 표준 입력을 재설정하고, 표준 입력 스트림에 메세지를 송신하면 된다.
TargetProgram.StartInfo.RedirectStandardInput = true;
StreamWrite sw = TargetProgram.StandardInput;
myStreamWriter.WriteLine("Hello ;)");
반응형
2007. 8. 8. 11:05
System Wake-up Events

원래의 목적은 SetSuspendState를 통해 Standby 상태로 진입시켜 놓고 Wake up Event를 발생시켜 활성상태로 복귀시키는 것이 목적이었다. MSDN에서는 Waitable timer를 통해 이러한 과정을 진행시키는 내용을 명기해 놓았고, 몇몇 자료에서 .NET 환경에서 Waitable timer는 System.Threading.Timer와 대응하기 때문에 이를 통해 Wake up Event를 발생시킬수 있다고 나와있으나, System.Threading.Timer도 API의 Waitable timer도 Standby 상태에서 자동으로 활성상태로 복귀시켜주지 않았다.

일단 주 목적은 모니터를 끄는 것이었기 때문에, 시간 관계상 SendMessage를 통해 모니터를 제어하는 수준에서 처리 하였다.
const int WM_SYSCOMMAND = 0x0112;
const int SC_MONITORPOWER = 0xF170;

const int MONITOR_ON = -1;
const int MONITOR_OFF = 2;
const int MONITOR_STANBY = 1;

[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

/* ... Turn Off ... */

SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

반응형
2007. 3. 22. 01:53
자야되는데 잠은 오질 않고 새벽 두시가 다 되어간다. 개인적으로 매력인 언어로만 생각하고 있었지, 그 속의 무수한 내용들을 아직 인지가 부족하다. Ajax 책은 많이 나왔지만, 그 역시도 조금 더 나은 스크립팅 팁의 수준에서 머물고 있다.

정말 이렇게 대중적이면서 평가절하되고 몰이해되는 언어가 또 있을까 생각을 해보았다. 일전에 VBscript 대신 Jscript로 Server Page를 작성하면서, Server-Side 언어로써 JavaScript가 얼마나 매력적이면서 불완전한지를 경험한 적이 있었다. 그러면서도 계속 빠져드는건..? 알수가 없다.

Garbage Collector에 대한 내용을 정리중이다. 일단 가장 흔히 인지되고 있는 IE 메모리 누수현상중 순환참조에 대한 부분을 생각해 볼려고 한다.

먼저 순환 참조에 대한 일반적인 이해에는 Garbage Collector에 대한 간단한 작동 방식을 이해해야 된다.

다음 코드를 보자.
var Vervain = new Herb();
var Verbena = Vervain;
Vervena 가 객체 Vervain을 참조하게 되면 scope 내에 Vervain에 대한 참조카운트가 1이 증가한다. 그리고 실행이 끝나고, scope 를 벗어날 때 해당 scope 내에 Verbena는 파괴되게 된다. 그렇게 되면 Vervain 객체에 대한 참조카운트는 다시 1이 감소한다. 그렇게 되면 GC에서는 Vervain의 참조카운트가 0이 되었으므로 더 이상 사용하지 않는 객체로 판단하고 메모리를 해제하게 된다.

하지만 다음과 같은 경우는 어떨까?

var Vervain = new Herb();
var Verbena = new Herb();
Vervain.see = Verbena;
Verbena.see = Vervain;
Vervain과 Verbena는 서로를 참조하고 있다. 이러한 경우를 순환참조라고 한다. 객체에 대한 참조를 따라가 보면 완전한 연결고리를 형성하게 된다.

하지만 위와 같은 경우는 어떻게 메모리를 해제해야 될까? Vervain과 Verbena의 참조카운트는 모두 1이다. Vervain 를 해제하기 위해서는 Vervain에 대한 참조카운트가 0이 되어야 하는데, 이는 Verbena.see 가 Vervain을 참조하고 있다. 역으로 Verbena에 대한 참조카운트도 0이 되어야 하나 Vervain.see 는 Verbena를 참조하고 있다. 결국 이러한 순환참조는 메모리 누수현상을 가져오게 된다. (IE 7에선 이러한 문제가 해결되었다.) 이러한 메모리 누수현상을 방지하기 위해서는 위와 같은 순환 참조를 형성하지 않거나, Vervain.see = null 혹은 Verbena.see = null 을 할당함으로써 참조카운트를 0으로 만들어 GC에서 메모리를 해제하게끔 만들어야 한다.




반응형
2007. 3. 21. 14:01
FireFox 에는 onpropertychange event가 없다.
IE에서 DOM element의 값 변경사항 등을 감시하는데, 다음과 같이 쓰인다.

IE 기준:
var ROFL = function() {
	if (event.propertyName == "value") {
		alert("I got ya!");
	}
}

var inputElement = document.getElementById("input"); 
inputElement.onpropertychange = ROFL;
inputElement.value = "snooping..";


하지만, FF에는 onpropertychange 이벤트가 없다. 한참 고민을 하던 중에 예전에 Netscape에는 변수의 변화를 감시할 수 있는, watch, unwatch 가 있었다. 이 놈들이 DOM element 에도 적용이 되는지 테스트해보았다.

var header = document.getElementById("header");
header.watch("id", function(id, xn, xp) {
    alert(id + "," + xn + "," + xp);
});
header.id = ":)";
header.unwatch("id");

header.style.watch("width", ....);
header.style.width = "100px";
header.style.unwatch("width");

된다. :)
그러나, 확인되야 될 사항이 있다.

  1. closures 사용에 따른 메모리 유출.
  2. 감시되고 있는 객체가 삭제될 경우.
  3. unwatch 를 사용하지 않을 경우 메모리 유출.


반응형
prev"" #1 #2 next