After hours of tests I found a solution for my thread problems. I use the workaround specified below and I need to patch the player.c and player.h to make it thread save. The patch is attached. There were two problems: -if the mainloop will work with my ReplayControl before it is attached it will crash(fixed by workaround) -cControl were not thread safe (fixed by patch) I hope it will help somebody and maybe Klaus will include my cControlThreadSavePatch. Greeting Patrick > now I have written a workaround and it works. > > I have written cMyReplayControl inherit from cReplayControl. > > > //---------------cIvvonReplayControl.h------------------- > class cIvvonReplayControl: public cReplayControl{ > public: > cIvvonReplayControl(); > virtual ~cIvvonReplayControl(); > eOSState ProcessKey(eKeys Key); }; > //---------------cIvvonReplayControl.c------------------- > cMyReplayControl::cMyReplayControl():cReplayControl(){} > > cMyReplayControl::~cMyReplayControl(){} > > eOSState cMyReplayControl::ProcessKey(eKeys Key){ > if(!cReplayControl::Active()){ > dsyslog("ReplayControl is not Active. Use workaround1"); > cControl::Attach(); } > eOSState tmp = cReplayControl::ProcessKey(Key); > if(tmp==osEnd){ > dsyslog("ReplayControl is not Active. Use workaround2"); > cControl::Attach(); > tmp = cReplayControl::ProcessKey(Key); > } > if(tmp==osEnd){ > //only for debug > dsyslog("cMyPlayerControl is still not attached and Active!!!!!"); > exit(0); } > return tmp; > } > -------------- next part -------------- --- ./vdr-1.3.35/player.c 2005-11-02 08:40:23.000000000 +0100 +++ ./vdr-1.3.37/player.c 2005-12-19 10:41:38.000000000 +0100 @@ -40,6 +40,7 @@ // --- cControl -------------------------------------------------------------- cControl *cControl::control = NULL; +cMutex cControl::mutex; cControl::cControl(cPlayer *Player, bool Hidden) { @@ -61,12 +62,14 @@ void cControl::Launch(cControl *Control) { + cMutexLock MutexLock(&mutex); delete control; control = Control; } void cControl::Attach(void) { + cMutexLock MutexLock(&mutex); if (control && !control->attached && control->player && !control->player->IsAttached()) { if (cDevice::PrimaryDevice()->AttachPlayer(control->player)) control->attached = true; @@ -79,6 +82,7 @@ void cControl::Shutdown(void) { + cMutexLock MutexLock(&mutex); cControl *c = control; // avoids recursions control = NULL; delete c; -------------- next part -------------- --- ./vdr-1.3.35/player.h 2005-11-02 08:40:23.000000000 +0100 +++ ./vdr-1.3.37/player.h 2005-12-19 10:41:58.000000000 +0100 @@ -62,6 +62,7 @@ class cControl : public cOsdObject { private: static cControl *control; + static cMutex mutex; bool attached; bool hidden; protected: