code sản xuất và tiêu thụ
Trang 1 trong tổng số 1 trang
code sản xuất và tiêu thụ
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ụ
}
}
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ụ
}
}
truongsi93(I11C)- Tổng số bài gửi : 33
Join date : 30/08/2011
Age : 38
Đến từ : Quảng Nam
Similar topics
» Giải thich code cho vấn đề sản xuất tieu thụ
» CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
» Code vấn đề sản xuất tiêu thụ
» Thảo luận Bài 5
» Về các đoạn code sản xuất và tiêu thụ
» CODE BÀI TẬP VỀ SẢN XUẤT - TIÊU THỤ
» Code vấn đề sản xuất tiêu thụ
» Thảo luận Bài 5
» Về các đoạn code sản xuất và tiêu thụ
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết