SDL_鼠标按钮在释放鼠标按钮之前是否会发生? 我试图用C++中的SDL和FFMPEG制作一个视频播放器。我创建了两个独立的线程,一个在SDL窗口上渲染视频,另一个处理窗口事件。当用户单击并释放视频时,我希望它切换播放/暂停。但是,它会多次触发,事件甚至在我释放鼠标之前发生,这会导致不可预测的行为

SDL_鼠标按钮在释放鼠标按钮之前是否会发生? 我试图用C++中的SDL和FFMPEG制作一个视频播放器。我创建了两个独立的线程,一个在SDL窗口上渲染视频,另一个处理窗口事件。当用户单击并释放视频时,我希望它切换播放/暂停。但是,它会多次触发,事件甚至在我释放鼠标之前发生,这会导致不可预测的行为,c++,mouseevent,sdl-2,C++,Mouseevent,Sdl 2,我的代码: SDL_Event event; while (1) { SDL_PollEvent(&event); switch (event.type) { case SDL_QUIT: SDL_DestroyWindow(screen); SDL_Quit(); break;

我的代码:

SDL_Event event;

    while (1)
    {
        SDL_PollEvent(&event);

        switch (event.type)
        {
            case SDL_QUIT:
                SDL_DestroyWindow(screen);
                SDL_Quit();
                break;
            case SDL_MOUSEBUTTONUP:
                if (event.button.state == SDL_RELEASED)
                {
                    printf("Mouse released\n");
                }
                break;
        }
    }

当我点击窗口并按住时,我希望在我松开按钮之前,它不会打印
鼠标释放的
。但是,它会在我按住鼠标按钮的整个过程中打印鼠标释放的
。我不知道这是否与我在笔记本电脑上使用触摸板有关。

编辑:我的答案是错误的,请检查IInspectable的答案

您的错误是没有检查pollEvent提供的所有挂起事件,只检查一个。试试这个代码,告诉我你有多少个按钮

#include <SDL2/SDL.h>
#include <iostream>


int main(int argc, char *argv[]) {
    if(SDL_Init(SDL_INIT_VIDEO) != 0) {
        throw std::runtime_error("SDL failed to initialize.\n");
    }

    SDL_Window *window = SDL_CreateWindow("App", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, NULL);

    bool done = false;

    while(!done) {
        SDL_Event event;

        while(SDL_PollEvent(&event)) {
            if(event.type == SDL_QUIT) {
                done = true;
            }

            if (event.type == SDL_MOUSEBUTTONUP) {
                if (event.button.state == SDL_RELEASED) {
                    printf("Mouse released\n");
                }
            }
        }
    }

    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;
}
#包括
#包括
int main(int argc,char*argv[]){
如果(SDL_Init(SDL_Init_视频)!=0){
抛出std::runtime_错误(“SDL未能初始化。\n”);
}
SDL_Window*Window=SDL_CreateWindow(“应用程序”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,640480,空);
bool done=false;
而(!完成){
SDL_事件;
while(SDL_事件和事件)){
if(event.type==SDL\u QUIT){
完成=正确;
}
if(event.type==SDL_MOUSEBUTTONUP){
如果(event.button.state==SDL_已发布){
printf(“鼠标释放\n”);
}
}
}
}
SDL_窗口(窗口);
SDL_退出();
返回0;
}
有一个返回值,您将忽略它

[It]如果有任何未决事件,则返回1;如果没有可用事件,则返回0

给定您的代码逻辑,每当没有挂起事件时,您都会一遍又一遍地处理上一个事件,直到新事件到来。这导致观察到的行为


最简单的修复方法是将整个事件处理包装在一个
if(SDL_polleevent(&event)){/*event handling*/}
条件中。

请给出您的问题的最小示例。@Aram I添加了一个示例。
SDL_polleevent
有一个返回值。这可能会证明非常有用。@IInspectable哇,那太尴尬了。。。这就是我没有彻底阅读文档的原因。它解决了我的问题,如果你把它变成一个答案,我会接受它。非常感谢。解释是错误的。OP肯定正在检索所有挂起的事件。真正的问题是,他们没有检查是否有任何新事件(通过检查返回值),从而反复处理同一事件,直到新事件出现。