Показать сообщение отдельно

  #7  
Старый 30.10.2023, 20:05
Digger Man52
Познавший АНТИЧАТ
Регистрация: 14.07.2019
Сообщений: 1,097
С нами: 3596877

Репутация: 183


По умолчанию

Цитата:
Сообщение от WeWorny  

Всем привет! я хочу спросить о моей проблеме в 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 не забудь
 
Ответить с цитированием