'컴퓨터 언어'에 해당되는 글 39건

  1. 2013.03.05 pThread를 이용한 Thread by 똘이 임덕규
  2. 2013.03.04 3. Java Application 만들기 by 똘이 임덕규
  3. 2013.03.04 2. Java 프로그래밍을 위한 준비 by 똘이 임덕규
  4. 2013.03.04 Java의 기원과 특징 by 똘이 임덕규
  5. 2013.02.25 Static 변수 by 똘이 임덕규
  6. 2013.01.16 메세지 기법 by 똘이 임덕규
  7. 2013.01.08 PyGame으로 기본 창 띄우기 by 똘이 임덕규
  8. 2013.01.06 Tkinter 를 이용, 간단한 이미지 뷰어 제작 by 똘이 임덕규
  9. 2013.01.06 Button Module by 똘이 임덕규
  10. 2013.01.05 창 띄우기 by 똘이 임덕규

C에서 Thread를 구현하기 위해서는 pthread.h 함수를 사용해야 한다. 


기본적인 Thread 함수

pthread_create

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
  • 쓰레드 생성을 위해서 사용 
  • 첫번째 인자인 thread 는 쓰레드가 성공적으로 생성되었을때 생성된 쓰레드를 식별하기 위해서 사용되는 쓰레드 식별자 
  • 두번째 인자인 attr 은 쓰레드 특성을 지정하기 위해서 사용, 기본 쓰레드 특성을 이용하고자 할경우에 NULL 을 사용 
  • 세번째 인자인 start_routine는 분기시켜서 실행할 쓰레드 함수
  • 네번째 인자는 쓰레드 함수의 인자
  • 리턴값은 성공시 0, 실패시 0 이상의 수

예제 example_1.c

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/* 쓰레드 함수 */
void *t_function(void *data)
{
    int id;
    int i = 0;

    id = *((int *)data);

    while(1)
    {
        printf("%d : %d\n", id, i);
        i++;
        sleep(1);
    }

    return;
}

int main()
{
    pthread_t p_thread[2];

    int thr_id;
    int status;
    int a = 1;
    int b = 2;

    /* 쓰레드 생성 인자로 1을 넘긴다 */
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a);
    if(0 < thr_id)
    {
        perror("thread create error : ");
        exit(0);
    }

    /* 쓰레드 생성 인자로 2를 넘긴다 */
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b);
    if(0 < thr_id)
    {
        perror("thread create error : ");
        exit(0);
    }

    /* 쓰레드 종료를 기다린다
     * 실행된 쓰레드에 대해서는 pthread_join 등의 함수를 이용하여 쓰레드가 종료될 때까지 기다려 주어야 한다.
     * pthread_join은 일종의 fork의 wait과 비슷하게 작동하며, 쓰레드 자원을 해제 시켜준다.*/
    
    pthread_join(p_thread[0], (void **)&status);
    pthread_join(p_thread[1], (void **)&status);
    
    return 0;
}


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10

가장 보편적 첫 예제인 "Hello World"를 출력함으로서 시작을 해보자.


Hello World.java

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello, Java Application");
    }
소스 작성시 유의할 점
  • main이 있는 class와 자바소스명은 같아야 함

컴파일
  • javac
    • javac HelloWorld.java 를 입력하고 실행함으로 Java VM에서 작동되는 Class 파일을 결과물로 얻을 수 있다.

실행

  • java
    • java HelloWorld 를 입력하면 아래와 같은 실행 결과를 확인할 수 있다.

자바와 C의 차이는

  • 자바는 Class로 이루어져 있으며 ,

  • C프로그램은 함수들로 이루어져 있다.


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

Java 프로그래밍을 위한 준비

Java SDK 설치 및 API 문서

환경 변수 설정
  • HOME 디렉토리에 있는 .profile 파일을 수정 아래의 경로들과 변수를 추가
    •   export JAVA_HOME="/usr/local/jdk1.6.0_12”
        export PATH=$PATH:$JAVA_HOME/bin
        export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
      윈도우즈 일 경우
    • C:\Program Files\Java\jdk1.7.0_11\bin // Path
      .; // Class Path
      
    • 이클립스등을 사용할시 조금 다를 수 있다.


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

제임스 고슬링 박사 팀에서 가전용 프로그래밍에 사용되며 플랫폼에 구애받지 않는 언어를 찾던중 개발된 언어


특징

  • C/C++언어와 유사하나 단순함
  • 플랫폼에 독립적
    • 아키텍처 중립적, 시스템 독립성
  • 완전한 객체지향 언어
  • 웹 또는 네트워크 프로그래밍이 용의
  • 엄격한 자료형의 검사
  • 예외 처리 기능을 제공
  • 멀티 스레딩 지원
Java 프로그램의 실행
  • JAVA Source 를 컴파일하여 바이트 코드를 만듬
  • 바이트 코드
    • 자바의 실행환경 즉 자바 가상머신에서 구동되는 바이트 코드를 이용하여 실행 할 수 있게 된다.
    • 확장자는 Class 를 사용

Java 플랫폼

  • 플랫폼이란
    • 프로그램의 실행을 위한 하드웨어와 소프트웨어 환경
  • Java 플랫폼이란
    • Java 프로그램이 동작하기 위한 환경 또는 가상의 기계
    • 운영체제에 맞는 Java 플랫폼을 설치해야 한다.
Java 플랫폼의 구성
  • Java VM
    • Java 프로그랭의 실행 환경을 제공하는 가상 기계
    • Java 프로그램의 구동엔진
    • 실행에 필요한 사항을 관리
    • 메모리 정리(Garbage collector) 를 자동으로 수행
  • Java API
    • 프로그랭 개발에 필요한 클래스 라이브러리
    • 패키지들이 계층 구조로 분류되어 있음

애플리케이션과 애플릿

  • 애플리케이션
    • Java 플랫폼에서 바로 실행되는 프로그램
  • 애플릿
    • HTML 웹 페이지에 포함된 웹 브라우져를 통해 실행
    • 웹 브라우져는 Java VM을 포함함


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

Static 변수의 특징

  • 다른 변수와 마찬가지로 해당하는 가장 윗 부분에 선언된다.
  • 전역 변수 처럼 '0' 으로 초기화 된다.
  • 함수가 끝나도 해당 값이 파괴되지 않는다.
  • 저장되는 메모리 영역은 전역 변수가 저장되는 정적 데이터 영역
  • 지역변수와 마찬가지로 해당 함수 안에서만 사용이 가능하다.

Static 변수의 특징을 잘 알아볼 수 있는 예제를 이용하여 정확히 파악

#include <stdio.h>

void printCount(void);

int main(void)
{
    int i;

    for(i = 0; 10 >= i; i++)
    {
        printCount();
    }
    
    return 0;
}

void printCount(void)
{
    static int i;

    printf("%d\n", i);
    i = i + 1;
    
    return;
}

함수 printCount 안의 변수인 i는 함수가 종료되어도 파괴되지 않고 값을 유지하고 있다. 



전역변수에서 static을 선언해 주면 다른 파일에서 해당 변수를 extern으로 건다해도 참조 할 수 없다.


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10

함수포인터를 이용한 유용한 기법중 하나인 “메세지 기법”에 대하서 정리했다.

struct MFT_Entry_Attribute_Type
{
    unsigned short	usNum;
    const char *	cDes;
    void (*fp)(void *);
} MFT_Attr_Type[] = {
    { 16, "$STANDARD_INFORMATION", Content_STD_INFO}
    ,{ 32, "$ATTRIBUTE_LIST",0}
    ,{ 48, "$FILE_NAME",Content_FILE_NAME}
    ,{ 64, "$VOLUME_VERSION or $OBJECT_ID",0}
    ,{ 80, "$SECURITY_DESCRIPTOR",0}
    ,{ 96, "$VOLUME_NAME",0}
    ,{112, "$VOLUME_INFORMATION",0}
    ,{128, "$DATA",0}
    ,{144, "$INDEX_ROOT",0}
    ,{160, "$INDEX_ALLOCATION",0}
    ,{176, "$BITMAP",0}
    ,{192, "$SYMBOLICK_LINK or REPARSE_POINT",0}
    ,{208, "$EA_INFORMATION",0}
    ,{224, "$EA",0}
    ,{256, "$LOGGED_UTILITY_STREAM",0}
    ,{257, "Unknown",0}
};
MFT_Entry_Attribute_Type 구조체는
  • 직접적인 비교에 쓰일 변수 한 개와
  • 메세지 출력을 위한 const char * 형의 변수 한 개,
  • 필요에 따라 함수를 호출할 수 있도록 함수 포인터 선언

으로 이루어져 있으며 소스에서 보는 바와 같이 구조체 선언과 동시에 구조체 배열 변수를 선언해 두었다.


이것을 어떻게 사용하는지 아래 소스에서 살펴보면,

void * test(void *p)            /* 213 페이지 */
{
    struct MFT_Entry_Attribute_Type * stpAttType;

    printf("========================= MFT Entry Attribute Analysis =========================\n");
    printf("Attribute Type                   : ");
    stpAttType = MFT_Attr_Type;
    while(1)
    {
        if(257 == (stpAttType->usNum))
        {
            break;
        }
        else if ((*((U32*)((U8*)p+0))) == stpAttType->usNum) /* 이동은 U8만큼으로 하고 보는건 U32로 보겠다 */
        {
            break;
        }
        ++stpAttType;
    }
    printf("%s\n", stpAttType->cDes);
    printf("Lenth of Attribute               : %dBytes\n", *((U32*)((U8*)p+4))); /* 이 길이를 알아내면 #2의 위치를 알 수 있다. */
    printf("Non-Resident Attribute           : %s\n", 1==(*((U8*)p+8)) ? "Yes":"No");
    printf("Lenth of Name                    : %d\n", *((U8*)p+9));
    printf("Offset to Name                   : %d\n", *((U16*)((U8*)p+10)));
    printf("Attribute Flags                  : ");
    if ( 0 != (0x0001 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Compressed ");
    }
    if ( 0 != (0x4000 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Encrypted ");
    }
    if ( 0 != (0x8000 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Sparse ");
    }
    if ( 0 == (0xC001 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Nothing");
    }
    putchar('\n');
    printf("Attribute Identifier             : 0x%04X\n", *((U16*)((U8*)p+14)));

    if(0==(*((U8*)p+8)))	// Resident Attribute 
    {
        printf("=== Resident Attribute========================\n");
        printf("====== Size of Content           : %d\n", *((U32*)((U8*)p+16)));
        printf("====== Offset to Content         : %d\n", *((U16*)((U8*)p+20)));
        printf("====== Index Flag                : %s\n", 1==(*((U8*)p+22)) ? "Yes":"No");
        printf("====== Padding                   : 0x%02X\n", *((U8*)p+23)); /* Reserve ㅇ */
        printf("==============================================\n");
    }
    else					// Non-Resident Attribute 
    {
    }
	
    if(0!=(stpAttType->fp))     /* 호출 함수가 있다면 호출 한다. */
    {
        (stpAttType->fp)(    (U8*)p + (*((U8*)p+20))     ); /* 함수 포인터 */
    }
    return (U8*)p + (*((U32*)((U8*)p+4))) ;
}
  • 3번 줄에서 위에서 선언한 MFT_Entry_Attribute_Type * stpAttType 포인터 변수 선언
  • 7번에서 전역으로 선언된 MFT_Attr_Type을 stpAttType에 대입
  • 8번줄에서 무한 루프를 돌면서 해당하는 값이 있는지 찾고 없으면 다음 값으로
  • 20번줄에서 해당 메세지를 출력
  • 58번줄에서 함수포인터 사용여부를 검사하여 호출 또는 넘어간다.

위와 같은 기법을 이용하면 메뉴 호출또는 메세지등을 손쉽게 할 수 있다.


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10

PyGame 라이브러리에서 제공하는 기능을 사용할 수 있는 창을 만들었다. 저기 안에서 그림들이 움직일 것이다.

import pygame, sys
from pygame.locals import *

pygame.init()                   # pygame 초기화
DISPLAYSURF = pygame.display.set_mode((400, 300)) # 화면크기 설정
pygame.display.set_caption('Hello World')         # 윈도우 타이틀 설정

while True:
    for event in pygame.event.get(): # 입력에 대한 이벤트가 있을 경우
        if event.type == QUIT:       # 종료시 입력시
            pygame.quit()            # pygame을 종료한 후
            sys.exit()               # 프로그램 종료
        pygame.display.update()      # 화면 갱신

  • Pygame.init()
    • 모듈 가져오기 이후 꼭 불러와야 할 초기화 함수
    • 이 함수가 무엇을 하는지는 우리가 알 필요는 없다.
  • DISPLAYSURF = pygame.display.set_mode((400, 300))
    • pygame.display.set_mode()는 pygmae.Surface 객체를 반환한다.
    • 터플형으로 들어있을 두 개의 정수는 픽셀 단위로 창의 가로, 세로 길이를 정한다.
    • 터플형으로 들어가 있어야 함을 잊지 말자.
  • 프로그램을 실행 및 지속 시키는 유일한 방법은 while loop로 프로그램을 두는 것이다.
    • 실행중인 프로그램에서 나가는 방법은 break문을 동작하게 만들어 두는 것이다.
    • 이것은 main game loop또는 main loop라 불리고 아래의 일들을 하게된다.
      • 이벤트 처리
      • 게임 상태 갱신
      • 게임 화면을 그린다.
    • 아래와 같은 순환 구조를 가진다

    • for event in pygame.event.get():
      • 이벤트 함수가 for문에 원소들을 event에 대입 시키며 루프가 해당 이벤트가 있었는지 검사하게 되는데, pygame.event.get()은 입력 받은 값을 내보내고 있는것이다.
      • 이벤트가 일어나지 않으면 빈 리스트가 돌게된다.
    • sys.exit()함수를 부르기 전에 반드시 pygame.quit()를 실행하여 라이브러리를 올바로 종료시킨 다음 프로그램을 마친다.
    • pygame.display.update()
      • Surface 객체(화면)에 저장되어있는 바뀐 화면을 뿌린다.


저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
TAG pygame, Python


앞서 잠시 살펴보고 버릴려고 했던 Tk 로 그래도 간단하게나마 뭔가 만들어나 볼까 해서 나온게 사진을 불러 올 수 있는 버튼과 사진크기 출력해주는 라벨만 가져다 붙였다.


디자이너 같은게 있다고 들었지만 딱히 파고들 만한게 아니였기 때문에 다른 툴은 사용하지 않았다. 이런 GUI 만들때는 무조건 디자이너 툴을 사용하는게 맞다는 생각이 든다.

# coding: utf-8
"""
Tkinter 와 media 모듈을 이용, 간단한 이미지 뷰어
버튼을 눌러 파일을 선택 및 이미지로 불러온 다음, 새창에 출력
메인 윈도우에는 이미지의 크기를 출력 
"""

from Tkinter import *
import media

class mainUI():
    def __init__(self, parent): # 생성자 시작
        self.parent = parent    

        # 라벨 값 변경을 위한 객체 선언
        self.picWidth = StringVar()
        self.picHeight = StringVar()
        
        self.initUI()
        
    def initUI(self):
        self.parent.title("Raven") # 메인 윈도우 타이틀 설정
        self.buttonLoadFile = Button(self.parent, # 부모 윈도우 설정
                                     text = "파일 불러오기", # 버튼 타이틀
                                     command = self.loadFile) # 클릭시 불러올 함수
        self.buttonLoadFile.place(x = 20, y = 10)

        # Label for height
        self.labelHeight = Label(self.parent, text = "Height : ") # 라벨 설정
        self.labelHeight.place(x = 20, y = 50) # 라벨 좌표
        self.labelInfoHeight = Label(self.parent, textvariable = self.picHeight) # 값 출력을 위한 라벨
        
        # Label for Width
        self.labelWidth = Label(self.parent, text = "Width : ")
        self.labelWidth.place(x = 20, y = 80)
        self.labelInfoWidth = Label(self.parent, textvariable = self.picWidth)

    def loadFile(self):
        self.pic_file = media.load_picture(media.choose_file()) # 파일을 선택하고 이미지로 불러들여서 객체화
        media.show(self.pic_file)                               # 이미지를 새창에 출력
        self.showInfo()                                         # 이미지 정보 출력을 위한 메소드콜
    
    def showInfo(self):
        self.picHeight.set(media.get_height(self.pic_file)) # Height
        self.labelInfoHeight.place(x = 80, y = 50)

        self.picWidth.set(media.get_width(self.pic_file)) # Width
        self.labelInfoWidth.place(x = 80, y = 80)

    # def loadFile(self):
    #     self.C = Canvas(self.parent)        
    #     self.pic_file = PhotoImage(file = media.choose_file())
    #     self.image = self.C.create_image(0, 
    #                                      0, 
    #                                      image = self.pic_file)
    #     self.C.pack()

def main():
    mainWindow = Tk()
    mainWindow.geometry("300x150+300+300") # 메인 윈도우의 창크기와 위치
    app = mainUI(mainWindow)
    mainWindow.mainloop()

if __name__ == "__main__":
    main()

저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
TAG GUI, Python, TK, Tkinter


윈도우에 버튼을 추가하여 버튼의 이벤트로 글씨나 그림 또는 그림과 같이 메세지박스를 띄울 수 있다. 사용법은 아래와 같다.
button1 = Tkinter.Button(부모객체, 옵션명="")
button1 = Tkinter(top, text="hello")
버튼이라는 객체를 생성시 top을 부모 윈도우로 지정, hello라고 적힌 버튼을 만든다.

옵션

위 그림의 소스

# coding: utf-8
import Tkinter
import tkMessageBox             # 메세지 박스 모듈

top = Tkinter.Tk()

def helloCallBack():                      
   tkMessageBox.showinfo( "Hello Python", # 메세지박스 타이틀
                          "Hello World")  # 메세지 박스 내용

B = Tkinter.Button(top,         # 부모 객체
                   text ="Hello", # 버튼에 들어갈 텍스트
                   command = helloCallBack) # 호출할 함수

B.pack()
top.mainloop()

여기에 옵션을 넣어서 만든 버튼 예제.

위 버튼은 아래의 소스에 옵션들과 함께 정리해 두었다. 사용법을 알 수 없었던 Image 옵션은 나중에 알게되면 따로 수정.

# coding: utf-8
import Tkinter, Image, ImageTk
import tkMessageBox

top = Tkinter.Tk()

def helloCallBack():
   tkMessageBox.showinfo( "Hello Python", # 메세지박스 타이틀
                          "Hello World")  # 메세지 박스 내용

B = Tkinter.Button(top,         # 부모 객체
                   text = "Hello\nWorld", # 버튼에 들어갈 텍스트
                   activebackground = "Khaki", # 마우스가 위에 있을때 버튼 색
                   activeforeground = "red",   # 마우스가 위에 있을때 글자 색
                   bd = "5",                   # 버튼의 테두리 두께
                   bg = "yellow",               # 버튼의 평상시 배경 색
                   fg = "blue",                 # 버튼의 평상시 글자 색
                   font = ("verdana", "10"),            # 버튼의 글꼴
                   
                   height = "5",                        # 버튼의 크기
                   width = "10",                        
                   
                   highlightcolor = "black",
                   justify = "right", # 버튼의 글이 여러줄일때 어느쪽으로 맞출지 정함
                   # center, right, left
                   padx = "10",       # 간격
                   pady = "10",
                   relief = "ridge",        # 버튼 기본 모양
                   # sunken, raised, groove, ridge
                   
                   state = "active",      # 버튼을 사용, 또는 사용안함
                   #active (비활성화 모양이지만 사용할 수 있음), disable, normal

                   underline = "3",         # 4번째 글자에 밑줄
                   wraplength = "40",       # 글씨를 안보이는 가상 상자안에 싼다
                   
                   command = helloCallBack) # 호출할 함수

B.pack()
top.mainloop()
저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03

# coding: utf-8

import Tkinter                  # Tkinter 모듈 가져오기

top = Tkinter.Tk()              # top 객체 생성

top.mainloop()                  # mainloop() 메소드 실행으로 창을 띄운다.

저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
파이썬 실행 해보기  (0) 2012.09.28
TAG GUI, pytk, TK, Tkinter


티스토리 툴바