Giải thich code cho vấn đề sản xuất tieu thụ
2 posters
Trang 1 trong tổng số 1 trang
Giải thich code cho vấn đề sản xuất tieu thụ
#include <stdio.h>
#include <conio.h>
#include <windows.h> // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // định nghĩa một buffer có số khoang chứa là 10
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // hàm sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthred: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây
nextConsumed=buffer[out]; //sản phẩm ở vị trí buffer out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4,&ProducerID1);
//tạo 1 luồng sản xuất, luồng này sẽ lấy giá trị trả về của hàm Producer và được ép kiểu (LPTHREAD_START_ROUTINE), số 0 tiếp theo chỉ ra hàm Producer ko có tham biến, số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1);
//0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sx cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
#include <conio.h>
#include <windows.h> // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // định nghĩa một buffer có số khoang chứa là 10
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // hàm sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthred: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây
nextConsumed=buffer[out]; //sản phẩm ở vị trí buffer out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4,&ProducerID1);
//tạo 1 luồng sản xuất, luồng này sẽ lấy giá trị trả về của hàm Producer và được ép kiểu (LPTHREAD_START_ROUTINE), số 0 tiếp theo chỉ ra hàm Producer ko có tham biến, số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1);
//0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sx cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
lekhanhhoa(I22B)- Tổng số bài gửi : 31
Join date : 24/03/2013
Re: Giải thich code cho vấn đề sản xuất tieu thụ
Ở lệnh "ru ngủ" hệ thống Sleep(GetTickCount()%5000) có lẽ nên cộng thêm 1 giá trị hằng để tránh trường hợp xấu nhất Sleep(0). Thanks your post!
Admin
- "Thức suốt đêm" để ôn thi có thể là một thực tế ! Hôm sau mà thi tốt thì Sleep(0) đâu có phải là "trường hợp xấu nhất" !
- Nói thế thôi, cứ ngủ cho tốt, nhưng nhớ đặt báo thức, vì mai thi Ca 1 !
Admin
- "Thức suốt đêm" để ôn thi có thể là một thực tế ! Hôm sau mà thi tốt thì Sleep(0) đâu có phải là "trường hợp xấu nhất" !
- Nói thế thôi, cứ ngủ cho tốt, nhưng nhớ đặt báo thức, vì mai thi Ca 1 !
TranQuocLoc(I22A)- Tổng số bài gửi : 10
Join date : 09/03/2013
Age : 34
Đến từ : Bà Rịa- Vũng Tàu
Re: Giải thich code cho vấn đề sản xuất tieu thụ
TranQuocLoc(I22A) đã viết:Ở lệnh "ru ngủ" hệ thống Sleep(GetTickCount()%5000) có lẽ nên cộng thêm 1 giá trị hằng để tránh trường hợp xấu nhất Sleep(0). Thanks your post!
Admin
- "Thức suốt đêm" để ôn thi có thể là một thực tế ! Hôm sau mà thi tốt thì Sleep(0) đâu có phải là "trường hợp xấu nhất" !
- Nói thế thôi, cứ ngủ cho tốt, nhưng nhớ đặt báo thức, vì mai thi Ca 1 !
^^ Thank you! Sir!
TranQuocLoc(I22A)- Tổng số bài gửi : 10
Join date : 09/03/2013
Age : 34
Đến từ : Bà Rịa- Vũng Tàu
Similar topics
» Thảo luận Bài 5
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Giai thich code cho van de san xuat tieu thu
» Giải thich code cho vấn đề sản xuất tieu thụ
» Giải thích code sản xuất tiêu thụ
» Giải thích code cho vấn đề sản xuất tiêu thụ
» Giai thich code cho van de san xuat tieu thu
» Giải thich code cho vấn đề sản xuất tieu thụ
» Giải thích code sản xuất 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