improve termination sequence on windows, use patterns instead of textures as directory name

This commit is contained in:
2019-02-20 11:48:17 +01:00
parent 7faab0124d
commit 033c39aef5
8 changed files with 81 additions and 58 deletions

View File

@@ -28,6 +28,13 @@ bool keys[256];
std::mutex gl_mutex;
std::mutex async_mutex;
std::thread::id gl_thread;
std::thread hmd_renderer;
std::thread renderer;
int running = -1;
std::mutex render_mutex;
std::condition_variable render_cv;
int gl_count = 0;
std::deque<std::packaged_task<void()>> tasklist;
std::mutex task_mutex;
@@ -606,11 +613,9 @@ int main(int argc, char** argv)
App::I.redraw = true;
});
bool running = true;
std::mutex render_mutex;
std::condition_variable render_cv;
running = 1;
std::thread renderer([&] {
renderer = std::thread([&] {
BT_SetTerminate();
LOG("start render thread");
const float target_fps = 10;
@@ -621,7 +626,7 @@ int main(int argc, char** argv)
float one_sec = 0;
float render_timer = 0;
float frame_timer = 0;
while(running)
while(running == 1)
{
t1 = GetTickCount();
float dt = (float)(t1 - t0) / 1000.0f;
@@ -707,12 +712,13 @@ int main(int argc, char** argv)
const int diff = framerate - (t1 - t0);
render_cv.wait_for(lock, std::chrono::milliseconds(diff));
}
LOG("renderer terminated");
});
std::mutex hmd_render_mutex;
std::condition_variable hmd_render_cv;
std::thread hmd_renderer([&] {
hmd_renderer = std::thread([&] {
if (!vive)
return;
@@ -722,7 +728,7 @@ int main(int argc, char** argv)
const float target_tick_rate = 90;
unsigned long t0 = GetTickCount();
while (running && vive->Valid())
while (running == 1 && vive->Valid())
{
std::unique_lock<std::mutex> lock(hmd_render_mutex);
unsigned long t1 = GetTickCount();
@@ -747,18 +753,21 @@ int main(int argc, char** argv)
async_lock();
vive->Terminate();
async_unlock();
LOG("hmd renderer terminated");
});
MSG msg;
LOG("start main loop");
while (running)
while (running == 1)
{
// If there any message in the queue process it
auto present = App::I.animate || App::I.redraw ?
PeekMessage(&msg, 0, 0, 0, PM_REMOVE) : GetMessage(&msg, 0, 0, 0);
running = !(msg.message == WM_QUIT/* || gl.keys[VK_ESCAPE]*/);
if (msg.message == WM_QUIT)
running = 0;
if (present)
{
DispatchMessage(&msg);
@@ -768,15 +777,9 @@ int main(int argc, char** argv)
if (!tasklist.empty())
render_cv.notify_all();
}
render_cv.notify_all();
if (renderer.joinable())
renderer.join();
if (hmd_renderer.joinable())
hmd_renderer.join();
App::I.terminate();
// Clean up
WacomTablet::I.terminate();
//DestroyWindow(hWnd);
DestroyWindow(hWnd);
UnregisterClass(className, hInst);
LogRemote::I.stop();
}
@@ -793,8 +796,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
switch (msg)
{
case WM_DESTROY:
if (running != -1)
{
running = 0;
render_cv.notify_all();
if (renderer.joinable())
renderer.join();
if (hmd_renderer.joinable())
hmd_renderer.join();
App::I.terminate();
}
break;
case WM_USER_CLOSE:
DestroyWindow(hWnd);
PostQuitMessage(0);
break;
case WM_PAINT: