Worker-Thread
-
Hallo Zusammen,
ich möchte in einer vorhandene Applikation eine Funktion asynchron machen.
meine Applikation soll die Protokolldaten nicht direkt in der DB Speichern, sondern in einer Liste zwischenspeichern und dann einen Thread starten ,der parallel läuft und die Daten aus der Liste in der DB speichern.Thread-Klasse
// #ifndef __CProtToDBThread__ // #define __CProtToDBThread__ #include <conio.h> #include "cProtList.h" #include "..\ProtMan\cProtocolObjManager.h" //class cProtocolObjManager; #ifndef __CProtToDBThread__ #define __CProtToDBThread__ static CProtList* pProtokolList; class CProtToDBThread: public CWinThread { public: //DECLARE_DYNCREATE(CProtToDBThread) CProtToDBThread(cObjFactory* pObjFactory); static UINT ProtToDbThread( LPVOID pParam ); virtual ~CProtToDBThread(); HANDLE GetHandle(void); void Beenden(void); void Resume(void); //void testThreading(int number); //int Run(); //BOOL InitInstance(); protected: //BOOL OnIdle(long lcount); //DECLARE_MESSAGE_MAP(); //afx_msg void HandleThreadMessage(WPARAM wParam, LPARAM lParam); //virtual int ExitInstance(); public: volatile BOOL m_bBeenden; private: static cObjFactory* m_pObjFactory; cParamDB* pParamDb; }; // END CLASS DEFINITION CProtToDBThread #endif // __CProtToDBThreadImplementierung:
#include "stdafx.h" #include "cProtToDBThread.h" #include "..\TimerObjBuilder\cParamDB.h" //#include "..\ProtMan\cProtocolObjManager.h" CProtToDBThread::CProtToDBThread(cObjFactory* pObjFactory) { m_hThread = (HANDLE)AfxBeginThread(ProtToDbThread, pObjFactory, THREAD_PRIORITY_ABOVE_NORMAL, 0, CREATE_SUSPENDED, NULL); if(m_hThread == NULL) { //TODO:Fehler beim Erzeugung des Threads melden } } CProtToDBThread::~CProtToDBThread() { } UINT CProtToDBThread::ProtToDbThread( LPVOID pParam ) { pProtokolList = ((cObjFactory*)pParam)->GetProtocolObjManager()->getProtList(); // ProList LPCSTR lpszTimerName = ""; while (m_bBeenden == false) { cTimerObj nElement; if(!pProtokolList->IsEmpty()) { nElement = pProtokolList->GetFromFront();// Timerobjekt aus dem Anfang der Liste holen und löschen ((cObjFactory*)pParam)->GetParamDB()->StoreProtocol(lpszTimerName, &nElement);// Timerobjekt speichern in der DB } } //((cObjFactory*)pParam)->GetProtocolObjManager()->getProtList(); // ProList return 0; } HANDLE CProtToDBThread::GetHandle( void ) { return m_hThread; } void CProtToDBThread::Beenden( void ) { m_bBeenden = true; } void CProtToDBThread::Resume( void ) { //m_hThread->ResumeThread(); this->ResumeThread(); }muss die Thread-Funktion static sein? ich darf damit nur auf statische variablen zugreifen.
brauche ich einen membervariable instanz von CwinThread in meiner Klasse oder kann ich "m_hThread" verwenden
wie verwende die Funktionen "Resume" richtig ?
wie steuere ich meinen Thread von aussen ?
und ....wie findet ihr mein Ansatz oder kann man sich besser vorgehen?
danke für jede Hilfeyoussef
-
Warum so kompilziert?
Du leitest doch schon von CWinThread ab.
Überschreibe einfach InitInstance und Run!
Verwende einfach AfxBeginThread(RUNTIME_CLASS(...Dann hast Du Deine Klasse und alles einfacher.
-
Ja, die Threadfunktion muss statisch sein, da sie auch ohne Instanz der Klasse aufrufbar sein muss. Du kannst ja aber neben der statischen auch eine nichtstatischte Überladung der Funktion erschaffen und diese dann aus der statischen aufrufen. Das beispiel dazu müsste ich mal suchen. Die Variable m_hThread ist doch aber eine Membervariable? Die würde ich auch dazu verwenden den Thread zu steuern. Vergiss nicht das delete am Ende.
Die implementierung mit dem Resume verstehe ich nicht ganz. Was willst du damit? Ich galube nicht das Du damit dem Thread sagt das er weiter laufen soll.