diff --git a/src/driver/lcdd.h b/src/driver/lcdd.h index 04e725a89..f6183906b 100644 --- a/src/driver/lcdd.h +++ b/src/driver/lcdd.h @@ -173,6 +173,7 @@ class CLCD void setled(int red, int green); static void *TimeThread(void *); pthread_t thrTime; + bool thread_running; #endif public: bool has_lcd; @@ -234,6 +235,9 @@ class CLCD void Clear(); void ShowIcon(vfd_icon icon, bool show); void ShowText(const char *s) { showServicename(std::string(s)); }; +#ifndef HAVE_TRIPLEDRAGON + ~CLCD(); +#endif #ifdef LCD_UPDATE private: CFileList* m_fileList; diff --git a/src/driver/simple_display.cpp b/src/driver/simple_display.cpp index 4bcfb4b0a..610fb3183 100644 --- a/src/driver/simple_display.cpp +++ b/src/driver/simple_display.cpp @@ -100,6 +100,17 @@ CLCD::CLCD() /* do not show menu in neutrino... */ has_lcd = false; servicename = ""; + thread_running = false; +} + +CLCD::~CLCD() +{ + if (thread_running) + { + thread_running = false; + pthread_cancel(thrTime); + pthread_join(thrTime, NULL); + } } CLCD* CLCD::getInstance() @@ -116,7 +127,7 @@ void CLCD::wake_up() void* CLCD::TimeThread(void *) { - while(1) { + while (CLCD::getInstance()->thread_running) { sleep(1); CLCD::getInstance()->showTime(); /* hack, just if we missed the blit() somewhere @@ -134,8 +145,10 @@ void* CLCD::TimeThread(void *) void CLCD::init(const char *, const char *, const char *, const char *, const char *, const char *) { setMode(MODE_TVRADIO); + thread_running = true; if (pthread_create (&thrTime, NULL, TimeThread, NULL) != 0 ) { perror("[neutino] CLCD::init pthread_create(TimeThread)"); + thread_running = false; return ; } }