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.

Về các đoạn code sản xuất và tiêu thụ

3 posters

Go down

Về các đoạn code sản xuất và tiêu thụ Empty Về các đoạn code sản xuất và tiêu thụ

Bài gửi  Nguyen Dinh Mai Huy(I82C) 1/11/2010, 15:01

Hổm đi học nhưng mình vẫn chưa hiểu lắm? Bạn nào có thể giải thích sơ lại từng dòng ở 2 hàm của chương trình sản xuất và tiêu thục không? Mình nghĩ nhiều bạn khác cũng muốn hiểu rõ hơn về 2 hàm này. Chúng ta cùng bàn luận nào.

Nguyen Dinh Mai Huy(I82C)

Tổng số bài gửi : 58
Join date : 15/09/2010

Về Đầu Trang Go down

Về các đoạn code sản xuất và tiêu thụ Empty Re: Về các đoạn code sản xuất và tiêu thụ

Bài gửi  vi_hung_i92 1/11/2010, 23:32

Hàm sản xuất:
void Producer(){
while (1){
// ... San xuat (nextProduced) --> quá trình tạo ra 1 sản phẩm

while(((in+1)%BUFFER_SIZE)==out); ---> vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm

//khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; //chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào

SuspendThread(GetCurrentThread()); //GetCurrentThread() -->lấy luồng hiện hành, SuspendThread --> hàm API dùng để tạo ngưng 1 luồng
}
}

Hàm tiêu thụ:

void Consumer(){
int nextConsumed;
while (1){
while(in==out); // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống

//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm

// ... Tieu thu (nextConsumed) --> quá trình tiêu thụ sàn phẩm

Sleep(GetTickCount()%5000); // hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm, ngủ trong khoảng GetTickCount() % 5000
}
}

Hàm Main

int main(){
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT

DWORD ProducerID1, ProducerID2; //chứa ID NSX và NTT

ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1); //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ


ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1); //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch()){
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;

}
Sleep(1); //ngừng 1 khoảng thời gian nhất định
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}

Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).

vi_hung_i92

Tổng số bài gửi : 21
Join date : 16/09/2010
Đến từ : Tp.Hồ Chí Minh

Về Đầu Trang Go down

Về các đoạn code sản xuất và tiêu thụ Empty Re: Về các đoạn code sản xuất và tiêu thụ

Bài gửi  Nguyen Dinh Mai Huy(I82C) 4/11/2010, 11:08

Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).

hihi, cám ơn thầy đã xác nhận bài giải thích của bạn, em sẽ học kĩ phần này để chuẩn bị kiểm tra.

Nguyen Dinh Mai Huy(I82C)

Tổng số bài gửi : 58
Join date : 15/09/2010

Về Đầu Trang Go down

Về các đoạn code sản xuất và tiêu thụ Empty Re: Về các đoạn code sản xuất và tiêu thụ

Bài gửi  tinlv_i91c 7/11/2010, 17:18

Cam on ban vi_hung_i92 da co nhung loi giai thich that chinh xac cho bai nay.
Cam on thay da co loi nhan xet va danh gia ve cau tra loi cua ban vi_hung_i92.
Em se chep bai nay de on tap.


vi_hung_i92 đã viết:Hàm sản xuất:
void Producer(){
while (1){
// ... San xuat (nextProduced) --> quá trình tạo ra 1 sản phẩm

while(((in+1)%BUFFER_SIZE)==out); ---> vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm

//khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; //chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; //tìm vị trí khác để Producer chèn thêm sản phầm vào

SuspendThread(GetCurrentThread()); //GetCurrentThread() -->lấy luồng hiện hành, SuspendThread --> hàm API dùng để tạo ngưng 1 luồng
}
}

Hàm tiêu thụ:

void Consumer(){
int nextConsumed;
while (1){
while(in==out); // vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống

//vòng lặp while thoát khi có 1 ngăn chứa sản phầm
nextConsumed=buffer[out]; //lấy sản phẩm ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; //tìm vị trí khác để Consumer lấy sản phẩm

// ... Tieu thu (nextConsumed) --> quá trình tiêu thụ sàn phẩm

Sleep(GetTickCount()%5000); // hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm, ngủ trong khoảng GetTickCount() % 5000
}
}

Hàm Main

int main(){
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT

DWORD ProducerID1, ProducerID2; //chứa ID NSX và NTT

ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID1); //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái ngủ


ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,0,&ConsumerID1); //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái thức
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch()){
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;

}
Sleep(1); //ngừng 1 khoảng thời gian nhất định
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}

Admin
- Rất tốt. Mọi thứ đơn giản như vậy thôi mà.
- Nên nói thêm về các vòng lặp "Chờ bận" (Busy-Waiting) tốn thời gian CPU (làm giảm hiệu năng máy) giống như tại ngã tư gặp đèn đỏ ai cũng phải "Liếc mắt" liên tục xem đèn xanh chưa ("mệt óc").
- Ngoài ra, cần chú ý đến sự cần thiết của Sleep(1) trước ShowBuffer trong mã của luồng chính: Trễ một chút để nhà sản xuất vừa được đánh thức kịp hoàn tất một chu trình công việc (nếu ShowBuffer ngay, kết quả hiển thị cỏ thể không phản ánh đúng nội dung Buffer và vị trí con trỏ In).

tinlv_i91c

Tổng số bài gửi : 39
Join date : 09/04/2010
Đến từ : Quang Ngai

Về Đầu Trang Go down

Về các đoạn code sản xuất và tiêu thụ Empty Re: Về các đoạn code sản xuất và tiêu thụ

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