2010. 1. 27. 18:24


ThreadEx1의 개량형 버젼입니다.

기존에는 반복횟수를 카운트 하는 쓰레드 에서 표시까지 직접하였었는데, 컨트롤에 텍스트 표시하는데 걸리는 CPU의 부하 라던가 시간을 생각하다가 그냥 반복만 돌면 스피드가 얼마나 나올까 하는 생각에 제외시키기로 해보았습니다.

하지만 반복이 끝나기까지 마냥 기다리려면 좀 답답한 감이 있으니... 별도로 쓰레드를 생성하여 반복루프를 도는 작업쓰레드의 진행상황을 표시해 주는것으로 짜 보았습니다.

실제로 루프 카운트 는 AA() 에서 올라가고, BB()는 AA()의 현재 진행상황을 비동기로 알려주고 있습니다.

예상했던 대로 엄청난 스피드를 보여주더군요^^


120000000 번의 반복을 10초도 안걸려서 끝내버렸습니다.
(Core 2 Duo T7300, 4GB DDR2, Win7, .NET2.0)

쓰레드2의 반복(표시)횟수는 쓰레드1과 동기화를 하지 않고 있으며, 쓰레드1이 끝날 때 같이 끝나게 되어있으므로 매번 카운트 횟수는 다르게 나옵니다.


기존에는 모든 반복카운트에 표시를 해주었다면...

이번에는 중간중간 빼먹어 가면서 표시를 해 주고 있다고 보면 됩니다.

 



 

Posted by 해비
2009. 12. 8. 17:22


Microsoft Office 2007 삭제 후 ODAC설치.



Posted by 해비
2009. 12. 2. 16:01

ORA-01861 literal does not match format string 

원인 : 문자 형식이 일치 하지 않음으로 발생하는 문제.

예) DATE 형식의 칼럼에 String 형식의 값을 대입할 경우... 등

해결) TO_DATE('2009-12-02','YYYY-MM-DD')




그러나 같은 소스파일인데 다른곳에서는 잘 되는 경우...

즉 한 곳에서는 그냥 정상적으로 실행되는 쿼리가 그대로 가져왔는데 안된다면 문자셋을 확인해 보기 바랍니다.


[환경변수] (instant client 10g 기준)

변수 이름 : NLS_LANG // 변수 값 :  KOREAN_KOREA.KO16MSWIN949
변수 이름 : TNS_ADMIN // 변수 값 : C:\Ora\instantclient

* TNS_ADMIN 경로는 자신의 컴퓨터에 오라클 instantclient 가 설치되어있는 경로를 지정합니다.


레지스트리 부분 

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
키 : NLS_LANG // 값 : KOREAN_KOREA.KO16MSWIN949


Posted by 해비
2009. 11. 17. 09:37

REPLACE
값을 치환합니다.


구문
REPLACE(String, str1, str2)
String 치환할 값이 들어있는 칼럼 입니다.
str1 치환할 대상 값 입니다.
str2 바뀔 값 입니다.


예)
SELECT REPLACE('2001-01-01','-','') FROM DUAL 의 결과값은 
20010101 입니다.

REPLACE()를 붙여서 '-'를 ''로(제거)한 예시 입니다.

Posted by 해비
2009. 11. 13. 15:23

TRUNC
수의 소수점 이하를 버리고 정수로 변환합니다.

구문
TRUNC(number,num_digits)
number 소수점 이하를 버릴 수입니다.
num_digits 소수점 이하를 무시할 정밀도를 나타내는 수입니다. 기본값은 0입니다.


구문2
TRUNC(SYSDATE)
SYSDATE 현재 시스템 날짜&시간 입니다.

예)
시스템 날짜 SELECT SYSDATE FROM DUAL 의 결과값은 
2009-11-16 오후 3:06:53 입니다.

TRUNC()를 붙이게 되면 시간부분은 잘려나가게 됩니다.

SELECT TRUNC(SYSDATE) FROM DUAL 의 결과값은
2009-11-16 입니다.

Posted by 해비
2009. 11. 13. 15:22

SUBSTR
지정한 범위의 문자를 잘라서 추출합니다.


구문
SUBSTR("string",num_start,num_end)
string 문자열 입니다.
num_start 잘라낼 시작 위치 입니다.
num_end 잘라낼 마지막 위치 입니다.

예문
substr("abcdef",1,4) 또는 substr("abcdef",1,-1)
"bcde"를 반환

문자열 adcdef에서 a(0), b(1), c(2), d(3), e(4), f(5) 가됩니다.
Posted by 해비
2009. 11. 13. 15:21

DECODE
값을 비교하여 해당하는 값을 리턴


구문
DECODE(column,조건,실행,조건2,실행2,...기본값)

예문
select decode(i_name, "홍길동", 1, 0) VALUE
from table1
where i_no = "12345678"

table1 에서 i_no의 값이 "12345678"인 필드의값을 추출해서 i_name이 홍길동이면 1, 아니면 0 을 VALUE로 리턴

결과 (i_name = "홍길동")
VALUE
1
Posted by 해비
2009. 11. 13. 15:21

NVL
값이 NULL일 경우 기본값으로 치환 합니다.

구문
NVL(column, default_value)
column 칼럼입니다.
default_value 지정되어질 기본값 입니다.

예문
NVL(num1, 10)
num1이 Null 일 경우, 10으로 치환
Posted by 해비
2009. 10. 1. 12:47

개발환경
- Visual Studio 2005 (SP1)
- Windows Vista Home Premium K (32-bit)




폼 디자인...
뭐 특별한건 없고 그냥 간단간단 설정좀 했습니다.
textBox1 만 있고 나머지는 그냥 배치만...

그림에 빠졌는데 반복횟수란 글자는 레이블(Label) 컨트롤 배치해 놓은것 입니다.


윗 부분에 쓰레드 사용을 위한 네임 스페이스를 지정해 줍니다.


Form1 클래스의 상단에 프로그램 전체에서 사용될 변수를 선언해 줍니다.
여기서는 쓰레드 3개를 사용하는 것으로 합니다.


Form을 더블클릭 하면 폼의 로드 이벤트로 넘어갑니다.
여기서 반복 횟수 입력 상자에 디폴트로 지정된 반복 횟수(th_Count)를 출력해 줍니다.

textBox1 에 실제로 내용을 출력해 주는 부분입니다.
쓰레드 내에서 이 함수에 값을 넘기면, textBox1에 내용을 추가하고 줄 바꿈 하는 형식으로 되어있습니다.

쓰레드가 반복횟수를 다 채우게 되면 하게 될 작업 입니다.

디자인 폼에서 button1 을 더블클릭 하면 button1의 클릭 이벤트로 넘어옵니다.
여기서 기본적인 셋팅과 함께 각 쓰레드들을 시작 시키는 일을 합니다.

- 현재의 반복횟수를 나타내는 변수 i 를 0으로 초기화 시킵니다.
- th_Count(반복횟수 지정)변수에 textBox2 에 입력된 숫자값을 입력합니다. (문자이면 ?)
- textBox1 을 클리어 시킵니다. (이전에 동작된 내용을 삭제)
- 쓰레드 동작중에 쓰레드 시작을 하게되는 button1 과 반복횟수 입력 되는 textBox2 를 건드리지 못하도록 Disable 시킵니다.

* textBox2 에 문자값이 들어가더라도 걱정할 이유는 없습니다.
소스코드에 보면 button1_Click 이벤트의 제일 첫 줄에 try 가 쓰이고 있습니다.
기본적인 형태는
try
{
//작업내용...
}
catch { }
입니다.

try 구문에 있는 작업 내용을 실행하되, 중간에 오류가 발생하면 그 시점에서 catch 구문으로 던져버립니다.
그런데 catch 에서 할 내용은 아무것도 없이 비워놓았으니 그냥 끝나버리게 됩니다.
만약 try catch 없이 그냥 본 내용이 들어갔을 경우, 문자값이 textBox2에 들어가면 뭔가 오류 메시지 박스가 뜨겠지요;;

경우에 따라서 try catch 에서 catch 구문에 친절하게 오류발생시 작업내용(오류 알림 상자... 등)을 작업하여도 됩니다.

쓰레드 th1, th2, th3 에서 수행할  AA(), BB(), CC() 입니다.
내용은 같습니다.
다만 출력할 때, 어느 쓰레드에서 작업한 내용인가를 알려주기 위한 문자값과, 쓰레드 시작 플래그 값만 조금 다를 뿐입니다.

- 일단 쓰레드가 시작되면 i의 값을 1 증가 시킵니다.
- 그리고 문자형 변수에 i의 값을 기록하고
- sPrint 함수에 현재 쓰레드를 알려줄 문자와 함께, 그 값을 던져 textBox1 에 출력 되게 합니다.
- i 의 값이 반복횟수 카운터(th_Count)의 값 이상이 되면 Reset_Ctrl() 함수를 호출하여 쓰레드를 중단 시킵니다.

폼이 종료 될때 해야 할 일을 기술하기 위해 Closing 이벤트를 생성해야 합니다.

폼 디자인 에서 폼을 선택한 후, 속성창에 보면 번개모양(이벤트) 아이콘이 있습니다.
여기서 FormClosing 부분을 찾은다음, 옆부분에 커서가 위치한 부분의 공란을 더블클릭 하여 줍니다.

그리하면, Form1 의 Closing 이벤트로 넘어옵니다.
여기서 할일은 쓰레드를 중단 하는것 입니다.

폼(Form1)이 종료될 때 쓰레드의 시작 플래그를 false 상태로 만들고, 쓰레드를 중단시킵니다.

컴파일 후, 실행하면 이렇게 나옵니다.
여러 개의 쓰레드가 동시에 동작을 하면서 sPrint()함수 에서 미처 줄바꿈을 실행하기도 전에 다른 쓰레드로 부터 값이 마구 들어와서 생기는 문제입니다.

다음과 같이 수정해 봅시다.
textBox1에 문자 기록하고 줄바꿈 하는 작업에 lock()을 씌워 봅시다.

그리고 다시 실행을 하면...
이제야 뭔가 형태를 갖춰서 실행이 됩니다.

lock() 을 걸게 되면 lock()이 풀릴때 까지 그 내부 코드에 다른 코드가 간섭을 못하게 잠금처리 해주는거 같아보이는 군요...

그런데... 순서가 좀 이상하죠? 숫자의 순서가 뒤죽박죽 입니다.
그럼 다른 부분에 잠금 처리를 하여 보겠습니다.

일단 sPrint 부분의 lock() 을 다시 제거 하여 줍니다.

변수 i 의 값을 증가 시키고 출력 시키는 부분에 lock()를 걸어 봅시다.
여기서는 AA() 의 수정된 코드만 표시합니다만, 실제로 BB()와 CC()도 이렇게 수정하여야 합니다.

변수 i의 값을 증가 시키고, 문자형으로 변환, 출력 하는 부분을 lock 으로 감싸서 도중에 다른코드로 부터 간섭을 받지 않도록 수정하였습니다.

이제 실행하게되면...
숫자가 정상적으로 순서대로 출력되는 것을 볼 수 있습니다.

숫자 앞의 쓰레드 문자는 랜덤 입니다.
실행 할때 마다 다른 쓰레드가 뜬다는거죠...

근데 한가지... 300 번 반복 시켰는데 302 ??

여기 올리지는 않았지만 쓰레드 1개를 제거하고 다시 돌리니 301 까지 뜨는것으로 봐서 쓰레드 3개 가 동시에 돌다가 중단 처리 하는 과정에 나머지 2개가 미처 실행중이던 내용을 기록하는게 아닌가 추측해 봅니다.



*** 위에서 AA(), BB(), CC() 부분은 내용이 거의 비슷비슷 합니다.
이것을 좀더 간단하게 만들어 봤습니다.
th_work() 함수를 작성하여 그것을 호출하였습니다.

실컷 다 만들어 놓고 다 써놓고 나서 생각나서 걍 생각나는대로 끄적여 봤습니다. ^^
저렇게 바꿔도 결과는 동일 합니다.

Posted by 해비
2009. 9. 20. 19:37



프로그래스 바를 활용한 쓰레드 예제 프로그램 입니다.
반복 횟수는 상단의 텍스트 상자를 활용해서 자유롭게~~~ 조절(?)이 가능합니다.

개발 환경
- Visual Studio 2005 (SP1)
- Windows Vista Home Premium K (32-bit)


내부 예제
- 스레드 생성 및 활용 (1개의 서브 쓰레드 생성)
- 쓰레드 중단 및 재개 (Pause 버튼과, Resume 버튼으로 제어)
- 실수 연산 및 결과를 소숫점 2째 자리 까지 잘라서 표현


메모
- 소스 내부에 주석이 달려있으며, 내용중 잘못된 부분 또는 버그가 존재 할수도 있습니다.

- 반복루프문 동작중에는 CPU점유율이 좀 높습니다.

- 이유는 잘 모르겠지만, 그 비주얼 스튜디오 디버깅 상태에서는 카운트 횟수가 올라가질 않더군요
  (Debug 폴더 안의 파일을 더블클릭 해서 실행 시키면 정상 동작 합니다.)

- 경고가 3개 있는데 아직 수정할 능력이 되지를 않네요 ㅎㄷㄷ
  suspend 1개, resume 2개 인데, 이거 쓰지 말고 다른 방법으로 하라는거 같은데 좀더 알아 봐야 되겠네요...

- [09/09/21] 패치에서 중단, 재개 기능은 쓰레드를 중단 시켰다가 새로이 초기화 해서 동작하는 방향으로 틀어버렸습니다.

- 변수는 전역변수 인지라 앞의 쓰레드가 하던 작업이 그대로 저장되어있다는 걸 이용한건데 이래도 되는건지...



수정
[09/09/21]
- 종료 관련 문제가 있어 Suspend와 Resume를 아예 빼버렸습니다 (-_-)

[09/09/20 - #2]
- 중단한 상태에서 종료시 프로세서가 계속 남아있는 문제를 수정하였습니다.



C# 접한지 얼마 안되는 초보 입니다. JAVA 책 보다가 갑자기 C# 할일이 생겨서 말이죠...
쓰레드 라는것을 처음 접하면서 책, 인터넷 뒤져가며 예제로 만들어 본 것인데...
고작 이거 하나 만들고 주말이 지나가 버렸네요 -ㅅ-;;

잘못된 부분 지적 환영합니다(^^)


주석부분, 제작자 부분 을 무단 수정하여 재배포 하는 일은 자제해 주시기 바랍니다.
Posted by 해비