Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在两个不同的线程(解决方案中没有线程)中使用SDL2渲染显示两个或多个不同的动画。C++;_C++_Linux_Multithreading_Animation - Fatal编程技术网

C++ 在两个不同的线程(解决方案中没有线程)中使用SDL2渲染显示两个或多个不同的动画。C++;

C++ 在两个不同的线程(解决方案中没有线程)中使用SDL2渲染显示两个或多个不同的动画。C++;,c++,linux,multithreading,animation,C++,Linux,Multithreading,Animation,我试图显示两个不同的动画,两个功能,一个渲染和两个线程 每次运行代码时,我都会遇到不同类型的错误。 例如:刷新函数中的分段默认值(行SDL_RenderPresent(w1.renderer);)以及其他奇怪的错误。每次都不一样 我知道如何在两个不同的线程中使用渲染。但是我不知道如何解决这个问题 当我只运行其中一个线程时,一切正常。但他们两个都不行 我只想在窗口周围显示不同的图形。(始终使用sdl2) 这是我的密码: 窗口h: class Window { public: SDL_Window

我试图显示两个不同的动画,两个功能,一个渲染和两个线程

每次运行代码时,我都会遇到不同类型的错误。 例如:刷新函数中的分段默认值(行SDL_RenderPresent(w1.renderer);)以及其他奇怪的错误。每次都不一样

我知道如何在两个不同的线程中使用渲染。但是我不知道如何解决这个问题

当我只运行其中一个线程时,一切正常。但他们两个都不行

我只想在窗口周围显示不同的图形。(始终使用sdl2)

这是我的密码:

窗口h:

class Window
{
public:
SDL_Window *window1;
int background,windowWidth,windowHeight,windowXcoord,windowYcoord;
SDL_Renderer * renderer;
SDL_Renderer * renderer2;
Window();
};

void refresh();
extern Window w1;
window.cpp:

Window w1;
Window::Window()
{
window1=nullptr;
background = 0xffffff;
windowWidth=700;      windowHeight=500;
windowXcoord = 650;  windowYcoord = 0;

this->window1 = 
SDL_CreateWindow("Window",windowXcoord,windowYcoord, 
windowWidth,windowHeight, SDL_WINDOW_SHOWN);
  this->renderer =  SDL_CreateRenderer( this->window1, -1 ,  
SDL_RENDERER_ACCELERATED);

SDL_SetRenderDrawColor( this->renderer, 255, 255, 255, 255 );
SDL_RenderClear( this->renderer );
SDL_RenderPresent(this->renderer);
}

// this function is called everytime an object or function want to "refresh" the window.

void refresh(){

// clearing the window
  SDL_SetRenderDrawColor( w1.renderer, 255, 255, 255,0 );
  SDL_RenderClear( w1.renderer );

// r1, the first Rects object to animate.
  SDL_SetRenderDrawColor( w1.renderer,255,0,0,255);
  SDL_RenderFillRect( w1.renderer, &r1.rect );

// r2, the second Rects.
  SDL_SetRenderDrawColor( w1.renderer,255,0,255,255);
  SDL_RenderFillRect( w1.renderer, &r2.rect );
  SDL_RenderPresent(w1.renderer);
}
矩形h:

class Rects
{
public:
SDL_Rect rect;

Rects();
};
extern Rects r1, r2;

void moveR1();
void moveR2();
rects.cpp:

Rects::Rects()
{ }
Rects r1,r2;

// moveR1 and moveR2, (just some dumm animations-example)
void moveR1(){
r1.rect.x=400; r1.rect.y=100;
r1.rect.w =40; r1.rect.h =10;
SDL_SetRenderDrawColor( w1.renderer,255,0,0,255);
SDL_RenderFillRect( w1.renderer, &r1.rect );
{
for (int u = 1; u<=5;u++){
r1.rect.x=200; r1.rect.y=100;
r1.rect.w =50; r1.rect.h =50;
refresh();
for (int i = 1; i <=200; i++){

r1.rect.x-=1;
usleep (7000);
refresh();
}
}
}
}
void moveR2(){
  r2.rect.x=200; r2.rect.y=100;
  r2.rect.w =40; r2.rect.h =10;
  SDL_SetRenderDrawColor( w1.renderer,255,255,0,255);
  SDL_RenderFillRect( w1.renderer, &r2.rect );
  {
     for (int u = 1; u<=5;u++){
           check
           r2.rect.x=200; r2.rect.y=100;
           r2.rect.w =50; r2.rect.h =50;
           refresh();
           for (int i = 1; i <=200; i++){

                 r2.rect.x+=1; r2.rect.y+=1;
                 usleep (7000);
              refresh();
              }
        }
  }
}
欢迎任何有礼貌的帮助,我在这里学习

当我只运行其中一个线程时,一切正常。但他们两个都不行

根据2D加速渲染(也称为
SDL_render.h
)的定义,换句话说,是
SDL_RenderPresent
所在的位置:

此API不是为从多个线程使用而设计的,有关详细信息,请参阅

你不可能很快做到这一点。通过查看错误的描述,它看起来像一个UB,指向错误的链接可能会为您提供所有详细信息

我只想在窗口周围显示不同的图形

您无需使用两个线程即可完成此操作。
您可以只更新位置、动画和图形所需的任何内容,并从同一线程显示它们。没有什么可以阻止您在调用
SDL\u RenderPresent
之前多次调用同一函数(例如
SDL\u RenderCopy
) 如果每个图形需要一个线程,那么视频上有数千个多边形的游戏呢?

//多亏了skypjack,我才能够解决这个问题
// thanks to skypjack, i am able to solve the problem
// HOW TO PRESENT TWO (OR MORE) GRAPHICS WITH SDL_RENDERER WITHOUT USING THREADS.
// The two rectangle animation are just and example. 
// It could be whatever we want to show.
// In this case, just two rectangles moving around.
#include <unistd.h>
#include <SDL.h>
using namespace std;

SDL_Window *window1;
int background, windowWidth, windowHeight,windowXcoord,
windowYcoord;

SDL_Rect rectangle1;
SDL_Rect rectangle2;
SDL_Renderer *renderer;
int sequence1;
int sequence2;
void moveRectangle1(), moveRectangle2();

int main()
{
  window1=nullptr;
  background = 0xffffff;
  windowWidth=700;      windowHeight=500;
  windowXcoord = 650;  windowYcoord = 0;
  window1 = SDL_CreateWindow("Main
  Window",windowXcoord,windowYcoord, windowWidth,windowHeight,
 SDL_WINDOW_SHOWN);
  renderer =  SDL_CreateRenderer( window1, -1 ,
SDL_RENDERER_ACCELERATED);

  SDL_SetRenderDrawColor( renderer, 255, 255, 255, 255 );
  SDL_RenderClear( renderer );
  SDL_RenderPresent(renderer);

  rectangle1.x = 100; rectangle1.y = 100; rectangle1.h = 40;
 rectangle1.w = 40;
  rectangle2.x = 100; rectangle2.y = 100; rectangle2.h = 40;
rectangle2.w = 40;

  for (int i = 1;i<500;i++){
              SDL_SetRenderDrawColor( renderer, 255, 255, 255,0 );
              SDL_RenderClear( renderer );
              // chequear return (cerrar programa)
              moveRectangle1();
              moveRectangle2();
              SDL_RenderPresent(renderer);
              usleep (12000);
        }
  return 0;
}

void moveRectangle1(){
    sequence1++;
  if (sequence1 <= 50){ rectangle1.x++; }
  else if (sequence1 <= 100){ rectangle1.x--; }
  else { sequence1 = 0; }

  SDL_SetRenderDrawColor(renderer,255,0,0,255);
  SDL_RenderFillRect(renderer, &rectangle1 );

}
void moveRectangle2(){
  sequence2++;
  if (sequence2 <= 100){ rectangle2.y++; }
  else if (sequence2 <= 200){ rectangle2.y--; }
  else { sequence2 = 0; }

  SDL_SetRenderDrawColor(renderer,0,200,0,255);
  SDL_RenderFillRect( renderer, &rectangle2 );
}
//如何在不使用线程的情况下使用SDL_渲染器呈现两个(或更多)图形。 //这两个矩形动画只是示例。 //它可以是我们想展示的任何东西。 //在这种情况下,只有两个矩形在移动。 #包括 #包括 使用名称空间std; SDL_窗口*窗口1; int背景、窗宽、窗高、windowXcoord、, 窗口坐标; SDL矩形1; SDL矩形2; SDL_渲染器*渲染器; int序列1; int序列2; void moveRectangle1(),moveRectangle2(); int main() { window1=nullptr; 背景=0xffffff; 窗宽=700;窗高=500; windowXcoord=650;windowYcoord=0; window1=SDL_CreateWindow(“主 窗口”,窗口中心,窗口中心,窗口中心,窗口宽度,窗口高度, SDL_窗口(如图所示); renderer=SDL_CreateRenderer(窗口1,-1, SDL_(加速); SDL_SetRenderDrawColor(渲染器,255、255、255); SDL_渲染器(渲染器); SDL_渲染器呈现(渲染器); 矩形1.x=100;矩形1.y=100;矩形1.h=40; 矩形1.w=40; 矩形2.x=100;矩形2.y=100;矩形2.h=40; 矩形2.w=40;
对于(int i=1;我是对的!我明白了,我将尝试不使用线程。谢谢你skypjack。skypjack,我发布了一个答案,其中的解决方案灵感来源于你教我的内容。再次感谢。
// thanks to skypjack, i am able to solve the problem
// HOW TO PRESENT TWO (OR MORE) GRAPHICS WITH SDL_RENDERER WITHOUT USING THREADS.
// The two rectangle animation are just and example. 
// It could be whatever we want to show.
// In this case, just two rectangles moving around.
#include <unistd.h>
#include <SDL.h>
using namespace std;

SDL_Window *window1;
int background, windowWidth, windowHeight,windowXcoord,
windowYcoord;

SDL_Rect rectangle1;
SDL_Rect rectangle2;
SDL_Renderer *renderer;
int sequence1;
int sequence2;
void moveRectangle1(), moveRectangle2();

int main()
{
  window1=nullptr;
  background = 0xffffff;
  windowWidth=700;      windowHeight=500;
  windowXcoord = 650;  windowYcoord = 0;
  window1 = SDL_CreateWindow("Main
  Window",windowXcoord,windowYcoord, windowWidth,windowHeight,
 SDL_WINDOW_SHOWN);
  renderer =  SDL_CreateRenderer( window1, -1 ,
SDL_RENDERER_ACCELERATED);

  SDL_SetRenderDrawColor( renderer, 255, 255, 255, 255 );
  SDL_RenderClear( renderer );
  SDL_RenderPresent(renderer);

  rectangle1.x = 100; rectangle1.y = 100; rectangle1.h = 40;
 rectangle1.w = 40;
  rectangle2.x = 100; rectangle2.y = 100; rectangle2.h = 40;
rectangle2.w = 40;

  for (int i = 1;i<500;i++){
              SDL_SetRenderDrawColor( renderer, 255, 255, 255,0 );
              SDL_RenderClear( renderer );
              // chequear return (cerrar programa)
              moveRectangle1();
              moveRectangle2();
              SDL_RenderPresent(renderer);
              usleep (12000);
        }
  return 0;
}

void moveRectangle1(){
    sequence1++;
  if (sequence1 <= 50){ rectangle1.x++; }
  else if (sequence1 <= 100){ rectangle1.x--; }
  else { sequence1 = 0; }

  SDL_SetRenderDrawColor(renderer,255,0,0,255);
  SDL_RenderFillRect(renderer, &rectangle1 );

}
void moveRectangle2(){
  sequence2++;
  if (sequence2 <= 100){ rectangle2.y++; }
  else if (sequence2 <= 200){ rectangle2.y--; }
  else { sequence2 = 0; }

  SDL_SetRenderDrawColor(renderer,0,200,0,255);
  SDL_RenderFillRect( renderer, &rectangle2 );
}