Другое С/С++ Вопрос - Ответ

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Digger Man52

52NGG
Проверенный
1,122
987
Как в Qt5 реализовать множественное наследование от двух классов QObject, оба из которых имеют свои сигналы и слоты, и при этом избежать проблем с дублированием метаобъектов и конфликтами имен в сигналах и слотах?
Просто каждый QObject имеет свой метаобъект, и при наследовании от двух классов будут созданы два металбъекта с теми же именами сигналов и слотов, как избавится от такого конфликта имен?
одно из моих предположений это использовать вирт наследование, и вручную опиеделять методы qt_metacall() , qt_metacast(), metaObject() в классе потомке для правильной организации метаобъектов, но может есть другие варианты?
 
  • Вау
Реакции: whyega52

Basedbounty

Активный
184
88
Как в imgui на с++ сделать кнопку start, и кнопку stop, если нажать на кнопку start - бесконечно будет в консоль выводится какой либо текст, но если нажать кнопку stop - вывод текста в консоль прекратится, нажму опять на start - опять начнется вывод текста, нажму опять на stop - вывод текста в консоль прекратится. Заранее спасибо!
 

Digger Man52

52NGG
Проверенный
1,122
987
Как в imgui на с++ сделать кнопку start, и кнопку stop, если нажать на кнопку start - бесконечно будет в консоль выводится какой либо текст, но если нажать кнопку stop - вывод текста в консоль прекратится, нажму опять на start - опять начнется вывод текста, нажму опять на stop - вывод текста в консоль прекратится. Заранее спасибо!
C++:
bool running = false;

void RenderUI()
{
    if (!running && ImGui::Button("Start"))
    {
        running = true;
        printf("Вывод текста.\n");
    }
    if (running && ImGui::Button("Stop"))
    {
        running = false;
        printf("Конец вывода текста.\n");
    }
}
и в твое окно, после ImGui::NewFrame();
C++:
ImGui::NewFrame();
RenderUI();
ImGui::Render();
 
  • Нравится
Реакции: Basedbounty

Basedbounty

Активный
184
88
C++:
bool running = false;

void RenderUI()
{
    if (!running && ImGui::Button("Start"))
    {
        running = true;
        printf("Вывод текста.\n");
    }
    if (running && ImGui::Button("Stop"))
    {
        running = false;
        printf("Конец вывода текста.\n");
    }
}
и в твое окно, после ImGui::NewFrame();
C++:
ImGui::NewFrame();
RenderUI();
ImGui::Render();
спасибо за ответ! но у меня не выходит, я буду рад если ты попробуешь это добавить в исходник имгуи, и поделится конечным результатом, сам исходник меню одного из ютуберов - https://github.com/cazzwastaken/borderless-imgui-window
 

Digger Man52

52NGG
Проверенный
1,122
987
спасибо за ответ! но у меня не выходит, я буду рад если ты попробуешь это добавить в исходник имгуи, и поделится конечным результатом, сам исходник меню одного из ютуберов - https://github.com/cazzwastaken/borderless-imgui-window
остальной код без изменений
C++:
bool running = false;
void gui::Render() noexcept
{
 ImGui::SetNextWindowPos({ 0, 0 });
 ImGui::SetNextWindowSize({ WIDTH, HEIGHT });
 ImGui::Begin(
  " ",
  &isRunning,
  ImGuiWindowFlagsNoResize |
  ImGuiWindowFlagsNoSavedSettings |
  ImGuiWindowFlagsNoCollapse |
  ImGuiWindowFlagsNoMove
 );


 

 if (!running && ImGui::Button("Start"))
 {
     running = true;
     printf("Вывод текста.\n");
 }
 if (running && ImGui::Button("Stop"))
 {
     running = false;
     printf("Конец вывода текста.\n");
 }

 if (running) // будет выводится вечно, пока running не станет false, так как меню отрисовывается каждый кадр, отсюда и проверка будет происходить каждый кадр
 {
     printf("Текст в цикле.\n");
 }

 ImGui::End();
 ImGui::NewFrame();
 ImGui::Render();
}
 
  • Нравится
Реакции: Basedbounty

Basedbounty

Активный
184
88
остальной код без изменений
C++:
bool running = false;
void gui::Render() noexcept
{
 ImGui::SetNextWindowPos({ 0, 0 });
 ImGui::SetNextWindowSize({ WIDTH, HEIGHT });
 ImGui::Begin(
  " ",
  &isRunning,
  ImGuiWindowFlagsNoResize |
  ImGuiWindowFlagsNoSavedSettings |
  ImGuiWindowFlagsNoCollapse |
  ImGuiWindowFlagsNoMove
 );


 

 if (!running && ImGui::Button("Start"))
 {
     running = true;
     printf("Вывод текста.\n");
 }
 if (running && ImGui::Button("Stop"))
 {
     running = false;
     printf("Конец вывода текста.\n");
 }

 if (running) // будет выводится вечно, пока running не станет false, так как меню отрисовывается каждый кадр, отсюда и проверка будет происходить каждый кадр
 {
     printf("Текст в цикле.\n");
 }

 ImGui::End();
 ImGui::NewFrame();
 ImGui::Render();
}
после запуска кода - меню без всего, это просто черный прямоугольник, но если я уберу строчки " ImGui::NewFrame();
ImGui::Render();" - меню уже будет с функциями, но если я нажму кнопку start - код воспроизведется как нужно, но я не могу нажать на кнопку stop. Вот скриншот того что происходит после кнопки start
xGjV56UWtBc.jpg
 

ARMOR

011110000111100101101001
Модератор
4,937
6,738
При инклуде d3d9.h к проекту в котором используется SAMP-API сразу летят ошибки от rpcnsip.h и rpcndr.h:
Знімок екрана 2023-10-30 163158.png


Знает ли кто какова причина этих ошибок, и есть ли возможность их пофиксить?
 
  • Нравится
Реакции: Z3roKwq

Basedbounty

Активный
184
88
Всем привет! я хочу спросить о моей проблеме в imgui на c++. Суть проблемы такова - У меня имеется две кнопки - start, stop. Start отвечает за начало цикла, а stop заканчивает его. Код в цикле который выполняется при кнопке Stop вызывает у меня проблему, если мне надо в коде того цикла заморозить функцию через Sleep - замораживается все imgui, и соответственно я не могу нажать на кнопку stop. Если что-либо не понятно - могу рассказать более подробно. Кусок кода ниже.
с++:
bool running = false;

void gui::Render() noexcept

{

ImGui::SetNextWindowPos({ 0, 0 });

ImGui::SetNextWindowSize({ WIDTH, HEIGHT });

ImGui::Begin(

"test",

&isRunning,

ImGuiWindowFlags_NoResize |

ImGuiWindowFlags_NoSavedSettings |

ImGuiWindowFlags_NoCollapse |

ImGuiWindowFlags_NoMove

);



if (!running && ImGui::Button("Start"))

{

running = true;

printf("Начало вывода текста.\n");

}

if (running && ImGui::Button("Stop"))

{

running = false;

printf("Конец вывода текста.\n");

}



if (running) // будет выводится вечно, пока running не станет false, так как меню отрисовывается каждый кадр, отсюда и проверка будет происходить каждый кадр

{

printf("Тут и происходит тот самый цикл после кнопки start");

Sleep(5000);

}



ImGui::End();

ImGui::Render();

}
Пока 5 секунд в цикле не пройдут, я не могу нажать на stop, но и тут проблема, у меня есть доля секунды пока опять начнется цикл, и мне надо ожидать 5 секунд.
 

Digger Man52

52NGG
Проверенный
1,122
987
Всем привет! я хочу спросить о моей проблеме в imgui на c++. Суть проблемы такова - У меня имеется две кнопки - start, stop. Start отвечает за начало цикла, а stop заканчивает его. Код в цикле который выполняется при кнопке Stop вызывает у меня проблему, если мне надо в коде того цикла заморозить функцию через Sleep - замораживается все imgui, и соответственно я не могу нажать на кнопку stop. Если что-либо не понятно - могу рассказать более подробно. Кусок кода ниже.
с++:
bool running = false;

void gui::Render() noexcept

{

ImGui::SetNextWindowPos({ 0, 0 });

ImGui::SetNextWindowSize({ WIDTH, HEIGHT });

ImGui::Begin(

"test",

&isRunning,

ImGuiWindowFlags_NoResize |

ImGuiWindowFlags_NoSavedSettings |

ImGuiWindowFlags_NoCollapse |

ImGuiWindowFlags_NoMove

);



if (!running && ImGui::Button("Start"))

{

running = true;

printf("Начало вывода текста.\n");

}

if (running && ImGui::Button("Stop"))

{

running = false;

printf("Конец вывода текста.\n");

}



if (running) // будет выводится вечно, пока running не станет false, так как меню отрисовывается каждый кадр, отсюда и проверка будет происходить каждый кадр

{

printf("Тут и происходит тот самый цикл после кнопки start");

Sleep(5000);

}



ImGui::End();

ImGui::Render();

}
Пока 5 секунд в цикле не пройдут, я не могу нажать на stop, но и тут проблема, у меня есть доля секунды пока опять начнется цикл, и мне надо ожидать 5 секунд.
C++:
bool running = false;
std::thread additionalThread; 

void StartAdditionalThread()
{
    additionalThread = std::thread(()
    {
        while (running)
        {
            printf("Start\n");

            std::thisthread::sleepfor(std::chrono::milliseconds(5000));
        }
    });
}

void StopAdditionalThread()
{
    if (additionalThread.joinable())
    {
        running = false;
        additionalThread.join();
    }
}

void gui::Render() noexcept
{
    ImGui::SetNextWindowPos({ 0, 0 });
    ImGui::SetNextWindowSize({ WIDTH, HEIGHT });
    ImGui::Begin(
        "test",
        &isRunning,
        ImGuiWindowFlagsNoResize |
        ImGuiWindowFlagsNoSavedSettings |
        ImGuiWindowFlagsNoCollapse |
        ImGuiWindowFlagsNoMove
    );

    if (!running && ImGui::Button("Start"))
    {
        running = true;
        printf("Начало вывода текста.\n");
        
        StartAdditionalThread();
    }

    if (running && ImGui::Button("Stop"))
    {
        running = false;
        printf("Конец вывода текста.\n");
        
        StopAdditionalThread();
    }

    ImGui::End();
    ImGui::Render();
}

#include <thread> не забудь
 
  • Нравится
Реакции: Basedbounty

Basedbounty

Активный
184
88
C++:
bool running = false;
std::thread additionalThread;

void StartAdditionalThread()
{
    additionalThread = std::thread(()
    {
        while (running)
        {
            printf("Start\n");

            std::thisthread::sleepfor(std::chrono::milliseconds(5000));
        }
    });
}

void StopAdditionalThread()
{
    if (additionalThread.joinable())
    {
        running = false;
        additionalThread.join();
    }
}

void gui::Render() noexcept
{
    ImGui::SetNextWindowPos({ 0, 0 });
    ImGui::SetNextWindowSize({ WIDTH, HEIGHT });
    ImGui::Begin(
        "test",
        &isRunning,
        ImGuiWindowFlagsNoResize |
        ImGuiWindowFlagsNoSavedSettings |
        ImGuiWindowFlagsNoCollapse |
        ImGuiWindowFlagsNoMove
    );

    if (!running && ImGui::Button("Start"))
    {
        running = true;
        printf("Начало вывода текста.\n");
      
        StartAdditionalThread();
    }

    if (running && ImGui::Button("Stop"))
    {
        running = false;
        printf("Конец вывода текста.\n");
      
        StopAdditionalThread();
    }

    ImGui::End();
    ImGui::Render();
}

#include <thread> не забудь
В этом имгуи я писал https://drive.google.com/file/d/14YBCAqpSlPzmXeAnPSWe4E6Hlhu4fsIl/view
 

Вложения

  • 9qwii82Qaxw.png
    9qwii82Qaxw.png
    30.6 KB · Просмотры: 20
  • cG2eZf0bfOo.png
    cG2eZf0bfOo.png
    47.5 KB · Просмотры: 20

Basedbounty

Активный
184
88
как мне сделать функцию StartAdditionalThread в отдельном файле. Чтобы при кнопке start вызывалась эта функция из другого файла