Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

+8
NguyenThiHang
ITPRO
nvhung_107H1040
vancoi
lqhlam
hugo
10761253_tuenhan
ngoanhtuan
12 posters

Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  ngoanhtuan 9/5/2009, 23:57

Hi mọi người,

Trong buổi thực hành tối thứ 7 ngày 9/5/2009 dựa và hướng dẫn của thầy mình có làm bài SX-TT 2 đèn hiệu để tạo ra 50 nhà sản xuất, tiêu thụ thực thi một cách tự động. Kính mong Thầy, cũng như các bạn tham khảo và đóng góp ý kiến cho mình.

Cảm ơn các bạn.

//==Begin==

#include "stdafx.h"

#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE 10

int buffer[BUFFER_SIZE];
char s[BUFFER_SIZE];

int in=0;
int out=0;

int nextProduced=1;

HANDLE semEmpty, semFull; // Hai den hieu

CRITICAL_SECTION critSec; // Bien kieu Mutex

void Producer(void * p){
while (1){
// ... San xuat (nextProduced)

// Cho den khi co cho trong
WaitForSingleObject(semEmpty, INFINITE);

EnterCriticalSection(&critSec);

buffer[in]=nextProduced++;

switch ((int)p){
case 1:
s[in]='P';
break;
case 2:
s[in]='p';
break;
default:
s[in]='S';
};

in=(in+1)%BUFFER_SIZE;

// Tang (semFull) len 1
ReleaseSemaphore(semFull, 1, NULL);

LeaveCriticalSection(&critSec);

Sleep(1000);
//SuspendThread(GetCurrentThread());
}
}

void Consumer(){
int nextConsumed;
while (1){
// Cho den khi co san pham
WaitForSingleObject(semFull, INFINITE);

EnterCriticalSection(&critSec);

nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;

// Tang (semEmpty) len 1
ReleaseSemaphore (semEmpty, 1, NULL);

LeaveCriticalSection(&critSec);

Sleep(1000);
}
}

void ShowBuffer(){ // In noi dung bo dem
const char * LeftMargin="\n ";
int i;

printf(LeftMargin);
for(i=0; i<(in*5); i++) putchar(' '); printf("!in");

printf(LeftMargin);
for (i=0; i<BUFFER_SIZE-1; i++)
printf("%c%2d, ", s[i], buffer[i]);
printf("%c%2d", s[BUFFER_SIZE-1], buffer[BUFFER_SIZE-1]);

printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');
printf("^out");

printf("\n");
}

int main(){
HANDLE ProducerHandle[50];

HANDLE ConsumerHandle[50];

DWORD ProducerID[50];
DWORD ConsumerID[50];


semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);

InitializeCriticalSection(&critSec);
// tao 50 luong san xuat trong trang thai tu dong
for(int i=0; i < 50; i++)
{
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao 50 luong tieu thu trong trang thai tu dong
for(int j=0; j < 50; j++)
{
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}

while(1)
{
EnterCriticalSection(&critSec);

Sleep(2000);
ShowBuffer();

LeaveCriticalSection(&critSec);
}
}
//==End==

ngoanhtuan

Tổng số bài gửi : 14
Join date : 08/05/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  10761253_tuenhan 10/5/2009, 09:45

theo e thay thi baii nay bi lap vo han thi fai.em nghi minh nen dua zo dieu kien dung cho no.

10761253_tuenhan

Tổng số bài gửi : 10
Join date : 09/05/2009
Age : 35

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  ngoanhtuan 10/5/2009, 09:54

Hi đồng chí 10761253_tuenhan,

Đã gọi là thực thi tự động rồi, thì nó chỉ dừng lại khi you đóng chương trình thôi chứ còn gì nữa.

Thanks&Regards
Tuấn

ngoanhtuan

Tổng số bài gửi : 14
Join date : 08/05/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  hugo 10/5/2009, 20:30

Thanks ban nha!
De ve minh chay thu xem the nao...trua gio lam no ma hok ra! Very Happy
hugo
hugo

Tổng số bài gửi : 15
Join date : 26/02/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  lqhlam 11/5/2009, 08:23

Thật ngưỡng mộ quá đi. Vậy bạn tốt bụng có thể giải thích được những dòng lệnh đó ko?
lqhlam
lqhlam

Tổng số bài gửi : 90
Join date : 17/03/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Thanks

Bài gửi  vancoi 11/5/2009, 08:32

Ban oi!!!!!!!! 2 vong for i va j lap 50 lần mình có thể gộp chung cho gọn k hông??????????

vancoi

Tổng số bài gửi : 45
Join date : 01/05/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  nvhung_107H1040 13/5/2009, 07:15

cám ơn bạn đã gửi code cho mọi người. Mình đang bí mà bạn lại cho mình cái phao rồi . Dựa theo code này chúng ta có thể làm được rất nhiều bài toán khác. 1 lần nữa xin cảm ơn bạn rất nhiều.
nvhung_107H1040
nvhung_107H1040

Tổng số bài gửi : 136
Join date : 04/03/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  ITPRO 13/5/2009, 09:36

Xin góp ý một xíu với các bạn:
Trường hợp gộp 2 vòng for lại với nhau thì không sai, nhưng sản xuất được bao nhieu thì tiêu thụ liền bấy nhiêu. Còn nếu 2 vòng for riêng biệt thì sản xuất được 50 rồi mới tiêu thụ hết 50 luôn.
ITPRO
ITPRO

Tổng số bài gửi : 73
Join date : 19/02/2009
Age : 46

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  NguyenThiHang 13/5/2009, 10:43

Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ

..................
..................

int main(){
HANDLE ProducerHandle[P];

HANDLE ConsumerHandle[C];

DWORD ProducerID[P];
DWORD ConsumerID[C];


semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);

InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}

while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}

Các bạn thử xem sau. Mình thấy tối ưu hơn.
NguyenThiHang
NguyenThiHang

Tổng số bài gửi : 14
Join date : 13/04/2009
Age : 40

http://www.ssic.com.vn

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  nguyenthiphuongchi 13/5/2009, 10:56

NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ

..................
..................

int main(){
HANDLE ProducerHandle[P];

HANDLE ConsumerHandle[C];

DWORD ProducerID[P];
DWORD ConsumerID[C];


semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);

InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}

while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}

Các bạn thử xem sau. Mình thấy tối ưu hơn.

Gọn hơn thôi, chứ thật chất cũng giống nhau thôi

nguyenthiphuongchi

Tổng số bài gửi : 57
Join date : 24/02/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  Lethanhtruc 13/5/2009, 11:09

nguyenthiphuongchi đã viết:
NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ

..................
..................

int main(){
HANDLE ProducerHandle[P];

HANDLE ConsumerHandle[C];

DWORD ProducerID[P];
DWORD ConsumerID[C];


semEmpty=CreateSemaphore(0, BUFFER_SIZE, BUFFER_SIZE, 0);
semFull=CreateSemaphore(0, 0, BUFFER_SIZE, 0);

InitializeCriticalSection(&critSec);
// tao P luong san xuat trong trang thai tu dong
for(int i=0; i < P; i++){
ProducerHandle[i] = CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer, (void *)(i+1), 0, &ProducerID[i]);
}
// tao C luong tieu thu trong trang thai tu dong
for(int j=0; j < C; j++){
ConsumerHandle[j]=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[j]);
}

while(1){
EnterCriticalSection(&critSec);
Sleep(1000);
ShowBuffer();
LeaveCriticalSection(&critSec);
}
}

Các bạn thử xem sau. Mình thấy tối ưu hơn.

Gọn hơn thôi, chứ thật chất cũng giống nhau thôi
Mình cũng thấy gọn hơn nhưng chưa biết có tối ưu hơn k. Trông thì cũng giống nhau đấy!

Lethanhtruc

Tổng số bài gửi : 64
Join date : 24/03/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  NguyenTheNam 13/5/2009, 14:00

Minh thay code cua ban Hang hay day chu!Chuc ban thi tot

NguyenTheNam

Tổng số bài gửi : 31
Join date : 21/02/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  asmking 13/5/2009, 15:05

NguyenThiHang đã viết:Bạn ứng dụng bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ để thực thi tự động. Nếu trong trường hợp có 1000 luồng sản xuất, tiêu thụ thì sau. Nếu dùng cách trên phải sửa lại dòng code. Sau bạn không dùng biến định nghĩa. Đoạn code sẽ tối ưu nếu có n luồng sản xuất, tiêu thu.
Bạn xem ý tưởng này nha

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE 10
#define P 1000 // 1000 luồng sản xuất
#define C 1000 // 1000 luồng tiêu thụ

Các bạn thử xem sau. Mình thấy tối ưu hơn.
_ Có 1 nguyên tắc trong lập trình, đó là nên sử dụng hằng số đối với những giá trị nào có thể cần thay đổi trong tương lai (nâng cấp hay phát triển phần mềm). Vì thế bạn Hằng đưa ra ý kiến như vậy mình cho là rất chính xác, đây là nguyên tắc cơ bản trong lập trình mà, không lẽ các bạn quên hết rồi sao? Smile
_ Nhắc bạn Hằng một chút : không phải là dùng biến định nghĩa mà là dùng Hằng số (constant).
_ Chào & chúc các bạn thi tốt chiều nay!
asmking
asmking

Tổng số bài gửi : 137
Join date : 19/03/2009

Về Đầu Trang Go down

Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động Empty Re: Ứng dụng Bài toán SX-TT 2 đèn hiệu để tạo ra 50 luồng sản xuất, tiêu thụ thực thi tự động

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết