Membuat Quiz Menggunakan Thread pada Bahasa C

Bagaimana membuat quiz dengan kita dapat menentukan waktu pengerjaan tiap soal? jadi jika tidak dapat menjawab soal dalam waktu yang ditentukan, maka akan beralih ke soal berikutnya dan dianggap tidak menjawab soal/salah. Setelah itu jawaban akan dicatat dalam sebuah teks dan hasil quiz akan ditampilkan di layar.

Membuat quiz yang seperti dijelaskan di atas bisa menggunakan thread. Dalam post ini saya menggunakan bahasa c dalam membuat program quiz tersebut.

Kode format soal quiz seperti berikut :

[jumlah_soal]
[waktu_pengerjaan] [kunci_jawaban]
[soal


]
* //soal diakhiri dengan tanda bintang ini '*'
[waktu_pengerjaan] [kunci_jawaban]
... //dan seterusnya

Contoh soal quiz :
------------------------------------------------------------------------------------
4
5 b
Berapakah 1 menit dalam detik?
a. 30
b. 60
c. 15
d. 25
*
4 c
Hewan yang bukan berkaki empat?
a. Kucing
b. Anjing
c. Ayam
d. Sapi
*
6 a
Ibukota Indonesia?
a. Jakarta
b. Jambi
c. Maluku
d. Surabaya
*
3 d
4 + 4 =
a. 2
b. 4
c. 6
d. 8
*
------------------------------------------------------------------------------------
Kode main.c :
------------------------------------------------------------------------------------
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int wak[10],nos[10];
char jaw[10];

char soal[10][255];

int flag[10];

pthread_t thread1, thread2;

FILE *rit, *krit, *krit2;

char jabt;
int noso=1;

int nilai=0, count;

void *input(int *no)
{
    int a = *( (int *) no);
    system("clear");
    printf("%d. %s",noso, soal[a]);
    printf("Jawab : ");
    scanf("%c", &jabt);
    getchar();
    pthread_cancel(thread1);
}

void *waktu(int *no)
{
    int a = *( (int *) no);
    while(wak[a]>0)
    {
        count++;
        sleep(1);
        if(count==wak[a])
        {
            pthread_cancel(thread2);
            pthread_cancel(thread1);
        }
    }
}

void cek(int no)
{
    if (jabt==jaw[no])
    {
        fprintf(krit,"%d %c benar - waktu : %d\n", no+1, jabt, count);
        nilai+=10;
    }
    else
        fprintf(krit,"%d %c salah - waktu : %d\n", no+1, jabt, count);
}

int main()
{
    krit=fopen("/home/wicakson/Documents/shift3/hasil.txt","w+");
    rit=fopen("/home/wicakson/Documents/shift3/soal.txt","r");
    int no=0, jumlah, i;
    fscanf(rit, "%d", &jumlah);
    for(no=0;no<jumlah;no++)
    {
        flag[no]=0;
        fscanf(rit,"%d", &wak[no]);
        fgetc(rit);
        fscanf(rit,"%c", &jaw[no]);
        fgetc(rit);
        i=0;
        fscanf(rit, "%c", &soal[no][i]);
        while(soal[no][i]!='*')
        {
            i++;
            fscanf(rit, "%c", &soal[no][i]);
        }
        soal[no][i]='\n';
    }
    for(no=0;no<jumlah;no++) puts(soal[no]);
    int sek, k=jumlah;
    while (k)
    {
        srand(time(NULL));
        sek = rand() % jumlah ;
        if(flag[sek]==0)
        {
            count=0;
            pthread_create(&thread2, NULL, (void *) &input, (void *) &sek);
            pthread_create(&thread1, NULL, (void *) &waktu, (void *) &sek);
            pthread_join(thread1, NULL);           
            pthread_join(thread2, NULL);
            cek(sek);
            pthread_cancel(thread1);
            k--;
            noso++;
            flag[sek]= 1;
        }
        jabt='\0';   
    }

    fprintf(krit,"\nNilai Anda: %d\n",nilai);
    char str[255];
    sprintf(str, "zenity --info --title=\"Selamat\" --text=\"Nilai Anda: %d\"", nilai);
    system(str);
    return 0;   
}
------------------------------------------------------------------------------------
Penjelasan beberapa fungsi dalam kode tersebut :
1.
2.
3.
4.
krit=fopen("/home/wicakson/Documents/shift3/hasil.txt","w+");
dan beberapa fungsi fprintf akan menghasilkan hasil.txt yang menampilkan hasil pengerjaan seseorang jika telah menjalankan quiz tersebut.

Contoh hasil.txt
------------------------------------------------------------------------------------
4 \00 salah - waktu : 4
3 \00 salah - waktu : 7
1 b benar - waktu : 3
2 b salah - waktu : 2
Nilai Anda: 10
------------------------------------------------------------------------------------
Contoh di atas terjadi jika anda tidak menjawab pada soal pertama dan kedua yang muncul, lalu anda menjawab b pada soal ketiga saat detik ke-3 dan menjawab b pada soal keempat saat detik ke-2.
Karena soal pada quiz ini dirandom pengeluarannya, maka setiap anda menjalankan program, akan berbeda urutan soalnya.
2 b salah - waktu : 2
[kode_soal] [input_jawaban]  [benar/salah] - waktu : [waktu_pengerjaan]
Jika anda tidak menjawab sama sekali seperti pada contoh di bawah ini
3 \00 salah - waktu : 7
maka waktu akan diset menjadi [waktu_pengerjaan+1]

1 komentar:

Thread

Apa itu thread ? thread merupakan intruksi yang dijalankan. Lalu, apa bedanya dengan proses ?


Gambar di atas menunjukkan tingkatan kombinasi proses dan thread yang dimiliki oleh sebuah komputer dari masa ke masa, contoh dari masing masing kombinasi adalah:
1. One Process One Thread -> MS DOS
2. One Process Multi Threads -> Java Virtual Machine
3. Multi Processes One Thread -> UNIX Family
4. Multi Processes Multi threads -> Hampir seluruh OS saat ini


PROSES VS THREAD
Proses:
- Memiliki ruang/space sendiri di memori untuk menampung process image
- Tidak dapat mengakses ruang lain di memori yang menjadi milik proses lain

Thread:
Dalam sebuah thread pada sebuah proses terdapat :
- Thread state
- Saved Thread Context saat tidak berjalan (Individual Program Counter)
- Execution Stack
- Local Variables
- Akses ke memory dan resource yang dimiliki oleh prosesnya
 
KEUNTUNGAN THREAD
1. Waktu pembuatan yang lebih cepat
2. Waktu pemberhentian yang lebih cepat
3. Waktu pergantian antar thread lebih cepat daripada antar proses
4. Komunikasi antar thread lebih efisien

PENGGUNAAN THREAD
a. Foreground & Background Work
b. Asynchronous Processing
c. Speed of Execution

THREAD STATE
Spawn - Thread muncul/dibuat oleh proses/OS
Block
 - Thread menunggu sebuah event
Unblock
 - Ketika event yang ditunggu oleh thread muncul
Finish
 - Thread selesai
 - Register context dan stack yang digunakan dibebaskan.

Jenis Implementasi Thread





USER LEVEL THREAD
Ciri-ciri :
- Kernel tidak mengetahui keberadaan thread
- Thread management dilakukan oleh aplikasi user level/library
Keuntungan :
- Thread switching tidak membutuhkan kernel mode privileges
- Dapat berjalan di berbagai OS
Kerugian :
- Satu  thread blocked, thread lain pada proses yang sama juga blocked
- Dua thread pada proses yang sama tidak dapat berjalan bersamaan pada dua prosesor

KERNEL LEVEL THREAD
Ciri-ciri :
 - Thread management dilakukan oleh kernel
Keuntungan :
- Thread pada proses yang sama dapat dijalankan pada prosesor yang berbeda
- Kernel routines juga dapat multithreaded
Kerugian :
- Thread switching antar proses yang sama tetap melibatkan kernel
- Dapat memperlambat

HYBRID LEVEL THREAD
Ciri-ciri :
- Ada sejumlah kernel level thread yang dipetakan ke sejumlah user level thread
- Pembuatan thread, scheduling, sinkronisasi dilakukan di user space.

Fakta menarik menengai thread :

  • Sebenarnya, yang berjalan pada prosesor adalah thread
  • Program mempunyai baris instruksi yang sangat banyak dijalankan secara sekuensial.
  • 1 proses merupakan sekumpulan thread, minimal 1 thread
  • 1 thread sekumpulan instruksi
  • Mozzila Firefox merupakan contoh multithread
  • Google Chrome merupakan contoh multiproses
  • Multi Process dan multi thread -> Apache
Mozzilla firefox dan google chrome merupakan salah satu web browser terbesar, tapi yang satu mengguna muultithread, yang satunya multi proses, apa dampaknya ?

Thread lebih cepat dibanding dengan proses. Tapi dalam beberapa thread pada satu proses, ada kemungkinan mereka saling berinteraksi, dan inilah yang membuat sistem keamanannya tidak seperti multiproses.

Ada juga beberapa aplikasi yang menggunakan multiproses dan multithread sekaligus, sehingga kecepatannya ramah, dan aman pada level tertentu 

0 komentar:

Socket Programming dengan bahasa C pada Linux


Socket
adalah interface pada jaringan yang menjadi titik komunikasi antarmesin pada Internet Protocol, dan tentunya tanpa komunikasi ini, tidak akan ada pertukaran data dan informasi jaringan.
Socket terdiri dari elemen-elemen utama sebagai berikut:

  • Protokol.
  • Local IP.
  • Local Port.
  • Remote IP.
  • Remote Port.

Komunikasi socket jaringan memang tidak mengenal lelah, pertukaran data terjadi terus-menerus dan memegang peranan vital.
Bayangkan sebuah server game online yang berkomunikasi tanpa henti, dimainkan oleh entah berapa banyak client yang tersebar. Ini merupakan salah satu contoh aplikasi dari sekian banyak aplikasi yang menggunakan socket jaringan untuk saling berkomunikasi dan bertukar data.

1. Membuat socket

Hal pertama ini harus dilakukan adalah membuat soketFungsi socket melakukan hal ini.
Berikut adalah contoh kode:

#include<stdio.h>
#include<sys/socket.h> 

int main(int argc , char *argv[])
{
 int socket_desc;
 socket_desc = socket(AF_INET , SOCK_STREAM , 0);
 
 if (socket_desc == -1)
 {
  printf("Could not create socket");
 }
 
 return 0;
}

2. Hubungkan socket ke server
 

Yang kita perlukan ada 2 hal, yaitu alamat ip dan nomor port untuk menyambung ke.

Untuk menyambung ke server jauh yang perlu kita lakukan beberapa halPertama adalah untuk menciptakan struktur sockaddr_in dengan nilai-nilai yang tepat.

Berikut contoh kodenya:

// IPv4 AF_INET sockets:
struct sockaddr_in
{
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
};

sockaddr_in memiliki anggota disebut sin_addr jenis in_addr yang memiliki s_addr yang tidak lain adalah sebuah panjangIni berisi alamat IP dalam format lama.

Fungsi inet_addr adalah fungsi yang sangat berguna untuk mengkonversi alamat IP ke format lama.

Berikut contoh kodenya:

server.sin_addr.s_addr = inet_addr ("10.42.0.1");

Jadi, Anda perlu tahu alamat IP dari server jauh Anda hubungi. 

Hal terakhir yang dibutuhkan adalah fungsi connectPerlu soket dan struktur sockaddr untuk menyambung ke.

Berikut adalah contoh kode:
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr

int main(int argc , char *argv[])
{
 int socket_desc;
 struct sockaddr_in server;
 
 //Create socket
 socket_desc = socket(AF_INET , SOCK_STREAM , 0);
 if (socket_desc == -1)
 {
  printf("Could not create socket");
 }
  
 server.sin_addr.s_addr = inet_addr("10.42.0.1");
 server.sin_family = AF_INET;
 server.sin_port = htons(8080);

 //Connect to remote server
 if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
 {
  puts("connect error");
  return 1;
 }
 
 puts("Connected");
 return 0;
}

Berikut adalah kode client socket

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 

int main(int argc, char *argv[])
{
    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr; 

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    } 

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 

    while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
        recvBuff[n] = 0;
        if(fputs(recvBuff, stdout) == EOF)
        {
            printf("\n Error : Fputs error\n");
        }
    } 

    if(n < 0)
    {
        printf("\n Read error \n");
    } 

    return 0;
}
Berikut adalaj kode server socket

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h> 

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char sendBuff[1025];
    time_t ticks; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

        ticks = time(NULL);
        snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
        write(connfd, sendBuff, strlen(sendBuff)); 

        close(connfd);
        sleep(1);
     }
}

1 komentar: