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

Digger Man52

52NGG
1,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как в 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

Известный
199
119
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,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
спасибо за ответ! но у меня не выходит, я буду рад если ты попробуешь это добавить в исходник имгуи, и поделится конечным результатом, сам исходник меню одного из ютуберов - 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

Известный
199
119
остальной код без изменений
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

God has forsaken us
Модератор
5,060
7,460
При инклуде d3d9.h к проекту в котором используется SAMP-API сразу летят ошибки от rpcnsip.h и rpcndr.h:
Знімок екрана 2023-10-30 163158.png


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

Basedbounty

Известный
199
119
Всем привет! я хочу спросить о моей проблеме в 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,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет! я хочу спросить о моей проблеме в 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

Известный
199
119
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 · Просмотры: 51
  • cG2eZf0bfOo.png
    cG2eZf0bfOo.png
    47.5 KB · Просмотры: 47

Digger Man52

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

Basedbounty

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

Digger Man52

52NGG
1,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как мне сделать функцию StartAdditionalThread в отдельном файле. Чтобы при кнопке start вызывалась эта функция из другого файла
создаешь другой файл, вообще поебать какое расширение(принято .h), назовем его допустим hui.lol потом #include "hui.lol" в основном файле, и прописываешь реализацию функции в hui.lol, потом вызываешь функцию
 
  • Нравится
Реакции: Basedbounty

Basedbounty

Известный
199
119
C++:
void func1(){
    std::cout « "func1";
}

void func2(){
    std::cout « "func2";
}

int main() {
    while(true) {
        func1;
        func2;
    }
    return 0;
}
- как вы видите у меня есть две функции, и третия основая, в которой я вызываю две эти функции, как мне в главной функции сделать что при вызове func1 - замараживалось на определенное время, но func2 продалжала работать, после разморозки функции func1, происходил код из func1, а потом опять замораживался, но func2 продалжал работу
 

Digger Man52

52NGG
1,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
void func1(){
std::cout « "func1";
}

void func2(){
std::cout « "func2";
}

int main() {
while(true) {
func1;
func2;
}
return 0;
} - как вы видите у меня есть две функции, и третия основая, в которой я вызываю две эти функции, как мне в главной функции сделать что при вызове func1 - замараживалось на определенное время, но func2 продалжала работать, после разморозки функции func1, происходил код из func1, а потом опять замораживался, но func2 продалжал работу
создать bool переменную, и если она фолс, то пропускать func1, а когда тебе надо, сделаешь ее true, если тебе по какому то таймеру надо, тогда запускай в отдельном потоке таймер и считай, потом делай true
 
  • Нравится
Реакции: Basedbounty
D

deleted-user-139653

Гость
такой вопрос, можно это реализовать на c++ в asi плагине? адреса памяти то понятно, но samp.events реально?

Lua:
local sampev = require("samp.events")
local memory = require("memory")

memory.write(0x70476E, 0x0B32, 4, true); memory.write(0x70476A, 0xE9575653, 4, true) --NoPostFx
memory.write(0x53EA95, 0xB7C7F0, 4, true); memory.setfloat(0xB7C7F0, 201, true) --Drawdist
memory.setuint8(getModuleHandle("samp.dll") + 0x9D170, 0xC3, true) --FpsUnlock
memory.copy(0x4EB9A0, memory.strptr("\xC2\x04\x00"), 3, true) --NoRadio
memory.copy(0x866C94, memory.strptr("$%d"), 6, true) --NoMoneyZero
memory.write(0x52228E, 0xB6EC1C, 4, true) -- SensitivityFix
memory.write(5497324, 235, 1, true) --NoTargetBlip
memory.write(8931716, 0, 4, true) --FixBlackRoads
memory.setuint8(0x5909AB, 0x1, true) --FastLoad

function main()
callFunction(0x7469A0, 0, 0)
end

function sampev.onServerMessage(color, text)
    if text:find("Чтобы завести транспорт") or text:find("Чтобы закрыть транспорт") then
        sampSendChat("/engine")
    end
end

function sampev.onShowTextDraw(id, data)
    data.text = data.text:gsub("~w~galaxy%-rpg%.online~n~", "")
    return {id, data}
end

function sampev.onDisplayGameText(style, time, text)
    return {4, 2000, text}
end
 
  • Эм
Реакции: F0RQU1N and

Digger Man52

52NGG
1,096
984
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
такой вопрос, можно это реализовать на c++ в asi плагине? адреса памяти то понятно, но samp.events реально?

Lua:
local sampev = require("samp.events")
local memory = require("memory")

memory.write(0x70476E, 0x0B32, 4, true); memory.write(0x70476A, 0xE9575653, 4, true) --NoPostFx
memory.write(0x53EA95, 0xB7C7F0, 4, true); memory.setfloat(0xB7C7F0, 201, true) --Drawdist
memory.setuint8(getModuleHandle("samp.dll") + 0x9D170, 0xC3, true) --FpsUnlock
memory.copy(0x4EB9A0, memory.strptr("\xC2\x04\x00"), 3, true) --NoRadio
memory.copy(0x866C94, memory.strptr("$%d"), 6, true) --NoMoneyZero
memory.write(0x52228E, 0xB6EC1C, 4, true) -- SensitivityFix
memory.write(5497324, 235, 1, true) --NoTargetBlip
memory.write(8931716, 0, 4, true) --FixBlackRoads
memory.setuint8(0x5909AB, 0x1, true) --FastLoad

function main()
callFunction(0x7469A0, 0, 0)
end

function sampev.onServerMessage(color, text)
    if text:find("Чтобы завести транспорт") or text:find("Чтобы закрыть транспорт") then
        sampSendChat("/engine")
    end
end

function sampev.onShowTextDraw(id, data)
    data.text = data.text:gsub("~w~galaxy%-rpg%.online~n~", "")
    return {id, data}
end

function sampev.onDisplayGameText(style, time, text)
    return {4, 2000, text}
end
ну, просто 3 хука…
 
  • Нравится
Реакции: Z3roKwq