Hallo!
Ich bin gerade dabei, einen VDR Patch zu schreiben. Nachdem Action() aufgerufen wurde,
läuft der Thread auch. Aber beim drücken des Powerknopfes meldet der VDR nicht, dass
noch etwas läuft. Er würde also sofort ausschalten. Beim Debuggen habe ich festgestellt,
dass die Active Methode beim Ausschalten nicht aufgerufen wird. Hab ich was wichtiges
vergessen?
Code
class cArchiveThread : public cThread {
private:
const char *error;
cRecording *recording;
int archiveaction;
protected:
virtual void Action(void);
public:
cArchiveThread(cRecording *Recording, int ArchiveAction); // ArchiveAction 0 = move to archive-hdd, 1 = move to videodir
virtual ~cArchiveThread();
const char *Error(void) { return error; }
};
cArchiveThread::cArchiveThread(cRecording *Recording, int ArchiveAction) : cThread("archiving"), error(NULL), recording(Recording), archiveaction(ArchiveAction)
{
Start();
}
cArchiveThread::~cArchiveThread()
{
Cancel(3);
}
void cArchiveThread::Action(void)
{
SetPriority(19);
SetIOPriority(7);
switch (archiveaction) {
case 0: isyslog("Moving %s from videodir to archive-hdd %s", strrchr((char*) recording->Name(), '~') +1, Setup.ArchiveMountPoint);
cArchiveTransfer::MoveToArchive(recording);
break;
case 1: isyslog("Moving %s from archive-hdd %s to videodir", strrchr((char*) recording->Name(), '~') +1, Setup.ArchiveMountPoint);
cArchiveTransfer::MoveToVideodir(recording);
break;
default: break;
}
Recordings.UpdateByName(recording->FileName());
Recordings.TouchUpdate();
}
// --- cArchiveTransfer-------------------------------------------------------
cMutex cArchiveTransfer::mutex;
cArchiveThread *cArchiveTransfer::archiveThread = NULL;
bool cArchiveTransfer::error = false;
bool cArchiveTransfer::ended = false;
bool cArchiveTransfer::Start(cRecording *Recording, int ArchiveAction)
{
cMutexLock MutexLock(&mutex);
if (!archiveThread) {
error = false;
ended = false;
archiveThread = new cArchiveThread(Recording, ArchiveAction);
return true;
}
return false;
}
void cArchiveTransfer::Stop(void)
{
cMutexLock MutexLock(&mutex);
bool Interrupted = archiveThread && archiveThread->Active();
const char *Error = archiveThread ? archiveThread->Error() : NULL;
delete archiveThread;
archiveThread = NULL;
if (Interrupted || Error) {
if (Interrupted)
isyslog("Archive action has been interrupted");
if (Error)
esyslog("ERROR: '%s' during archive action", Error);
// have to implement some clean up
}
}
bool cArchiveTransfer::Active(void)
{
cMutexLock MutexLock(&mutex);
if (archiveThread) {
if (archiveThread->Active())
return true;
error = archiveThread->Error();
Stop();
ended = true;
}
return false;
}
bool cArchiveTransfer::Error(void)
{
cMutexLock MutexLock(&mutex);
bool result = error;
error = false;
return result;
}
bool cArchiveTransfer::Ended(void)
{
cMutexLock MutexLock(&mutex);
bool result = ended;
ended = false;
return result;
}
bool cArchiveTransfer::MoveToArchive(cRecording *Recording)
{
//code not relevant
}
...
Display More
Und die Header:
C
#ifndef __FILETRANSFER_H
#define __FILETRANSFER_H
#include "recording.h"
#include "thread.h"
class cArchiveThread;
class cArchiveTransfer {
private:
static cMutex mutex;
static cArchiveThread *archiveThread;
static bool error;
static bool ended;
public:
static bool Start(cRecording *Recording, int ArchiveAction); // ArchiveAction 0 = move to archive-hdd, 1 = move to videodir
static void Stop(void);
static bool Active(void);
static bool Error(void);
static bool Ended(void);
static bool MoveToArchive(cRecording *Recording);
static bool MoveToVideodir(cRecording *Recording);
static bool Filecopy(const char *Sourcefile, const char *Destfile);
};
#endif
Display More