30/09/2018, 19:47

Lỗi khi chạy đa luồng trong C++?

Chào mọi người. Mình mới tìm hiều về đa luồng trong C++.Và bây giờ đang viết 1 chương trình minh họa chuyển động của trái đất và sao hỏa quanh mặt trời.

  • Mặt trời là hình tròn lớn nhất luôn đứng yên
  • Hai hình tròn nhỏ là trái đất và sao hỏa
  • Mỗi hình tròn nhỏ mình sẽ dùng 1 thread để quản lý hoạt động của nó. Khi chạy từng thread thì chạy bình thường, nhưng khi chạy cả 2 thread thì nó vẫn chạy nhưng cái hình tròn lớn nhất thì không hiện ra nữa và các hình tròn nhỏ lúc thì hiện ra lúc thì không hiện ?? Mọi người cho em hỏi lỗi gì vậy ạ ! Cảm ơn mọi người
#include <graphics.h>
#include <iostream>
#include <math.h>

void *earth_2(void *){
    initwindow(800,800);
    circle(400,300,100);
    setfillstyle(1,YELLOW);
    floodfill(400,300,WHITE);
    float x = 600;
    float y = 300;
    float alpha = M_PI/90;
    float c = 0;

    while(true){
        setcolor(GREEN);
        circle((int)x,(int)y,10);
        setfillstyle(1,GREEN);
        floodfill(x,y,GREEN);
        delay(10);

        setfillstyle(1,BLACK);
        floodfill(x,y,BLACK);
        setcolor(BLACK);
        circle(x,y,10);

        if(c == 360) c = 0;
        c+=alpha;
        x = 200 + 200 + 200*cos(c);
        y = 100 + 200 + 200*sin(c);
    }
}
void *yupiter_2(void *){
    //initwindow(800,800);
    //circle(400,300,100);
    //setfillstyle(1,YELLOW);
    //floodfill(400,300,WHITE);
    float a = 550;
    float b = 300;
    float alpha2 = M_PI/90;
    float d = 0;

    while(true){
        setcolor(GREEN);
        circle((int)a,(int)b,10);
        setfillstyle(1,GREEN);
        floodfill(a,b,GREEN);
        delay(5);

        setfillstyle(1,BLACK);
        floodfill(a,b,BLACK);
        setcolor(BLACK);
        circle(a,b,10);

        if(d == 360) d = 0;
        d+=alpha2;
        a = 250 + 150 + 150*cos(d);
        b = 150 + 150 + 150*sin(d);
    }
}
void Do_Nhu_Univer_2(){

    pthread_t t1,t2;
    pthread_create(&t1,NULL,earth_2,NULL);
    pthread_create(&t2,NULL,yupiter_2,NULL);
    getch();
}

Lỗi đây ạ

Quân viết 21:51 ngày 30/09/2018

lỗi rất đơn giản, vì 2 thread đều thực hiện vẽ và fill toàn màn hình do đó xảy ra TH thread này mới fill xong và vẽ xong thread kia lại fill và vẽ đè lên r nên k thấy gì cả, về phần cái mặt trời thì do thread vẽ trái đất được chạy trc và vẽ mặt trời lên, thread vẽ sao hỏa lại fill đè lên mất r, do đó bạn nên dùng 3 thread, 1 thread đảm nhận việc vẽ và chỉ nó mới được phép vẽ, 2 thread còn lại đảm nhận việc thay đổi thông tin vị trí của 2 hành tinh

nullnguyen viết 21:57 ngày 30/09/2018

mình muốn chỉnh tốc độ quay của trái đất với sao hỏa là khác nhau bằng lệnh delay() nhưng nếu vẽ chung cả 2 cái trong 1 thread thì sẽ không điều chỉnh tốc độ 2 cái khác nhau được

Quân viết 21:56 ngày 30/09/2018

why not, việc vẽ thì cứ vẽ, việc thay đổi vị trí thì cứ thay đổi thôi, bạn muốn chỉnh tốc độ riêng từng cái chứ gì, chỉ cần delay ở thread tương ứng, khi ấy dữ liệu về vị trí cũng bị delay thay đổi theo, do đó kết quả là vị trí được vẽ trên màn hình cũng bị delay theo thôi.
bạn xem code giả của mình sẽ hiểu ngay:

program{
    var: sunPosition;
    var: earthPosition;
    var: jupiterPosition;

    func draw(){
        clear();
        drawPlanet(sunPosition);
        drawPlanet(earthPosition);
        drawPlanet(jupiterPosition);
    }

    func clear(){
    // clear screen for new frame
    }
 
    func drawPlanet(Position position){
    // draw code here
    }

    func changeEarthPosition(){
       while (true){
           // do something change earth position
           sleep(1000); //delay to change rotation speed
       }
    }

    func changeJupiterPosition(){
       while (true){
           // do something change jupiter position
           sleep(1000); //delay to change rotation speed
       }
    }

    func main(){
        threadEarthStart(changeEarthPosition);
        threadJupiterStart(changeJupiterPosition);
        while (true){
           draw();
           sleep(100); // wait for a while to draw new frame
        }
    }
}
nullnguyen viết 21:48 ngày 30/09/2018

à để mình thử xem thế nào cảm ơn bạn. mà bạn viết bằng pascal à

Quân viết 22:04 ngày 30/09/2018

Tự mình nghĩ ra thôi, k phải ngôn ngữ lập trình j đâu

Bài liên quan
0