Erweiterung der CWinThread Klasse



  • Hallo Zusammen,

    Ich erweitere eine Worker Thread aus der CWinThread Klasse. Dabei moechte
    ich manche Methoden aus der Basis Klasse ueberschreiben. Die Deklaration &
    Definition meiner Klasse sehen so aus:

    #include <conio.h>
    #pragma once
    
    class DBWorker: public CWinThread
    {
    public:
    	DECLARE_DYNCREATE(DBWorker)
    	DBWorker(){};         
    	DBWorker(int no);
    	virtual ~DBWorker();
    	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:
    	int tTestingNum ;
    };
    
    #include "stdafx.h"
    #include "db_worker.h"
    
    IMPLEMENT_DYNCREATE(DBWorker, CWinThread)
    
    BEGIN_MESSAGE_MAP(DBWorker, CWinThread)	    
           ON_THREAD_MESSAGE(WM_USER+1,HandleThreadMessage)
    END_MESSAGE_MAP()
    
    DBWorker::DBWorker(int no){
    	DBWorker();
    	m_bAutoDelete = FALSE ;// Set the m_bAutoDelete to false
    	tTestingNum = no ;
    }
    
    //...
    
    BOOL DBWorker::InitInstance(){
    	// Thread Initialization general 
    	CWinThread::InitInstance();
            // my_init ;
    return TRUE;
    }
    
    //...
    
    int DBWorker::Run(){
     testThreading(tTestingNum);
    return 0;
    }
    
    //...
    
    // Prints 10 lines of alive message and
    // terminates itself..
    void DBWorker::testThreading(int number){
    
    	for(int i = 0 ; i < 10 ; i++)
    		_cprintf("I am thread:%d print_line:%d\r\n",number,i);
    
    	PostQuitMessage(WM_QUIT);
    }
    
    int DBWorker::ExitInstance(){
    	_cprintf("Instance exitting\r\n");
    
    return CWinThread::ExitInstance();
    }
    

    Die erste Scenario ist die Nebenlaeufigkeit mit MFC testen. Dafuer wird der
    Thread mit einem ID erstellt, wird durch Run() ausgefeuhrt. DBWorker::Run()
    macht nichts anderes als DBWorker::testThreading(int no) auszufeuhren. Diese
    Methode terminiert die Thread -nach 10 Zeilenausgaben in der Konsole- mit einem WM_QUIT
    Nachricht. Aus meiner View Klasse versuche ich die Threads so zu erzeugen:

    DBWorker* dbw ;
    	for(int i = 0 ; i < 5 ; i++){
    		dbw = new DBWorker(i);
    		dbw->Run() ;
    	}
    

    Wenn ich die Konsolenausgaben anschaue, da ist nicht von einer Nebenlaeufigkeit
    zu sprechen. In jedem Durchgang wird DBWorker Klassen sequentiell erzeugt, Run
    Methode wird ausgefeuhrt... Meine Frage ist, In welcher Reihenfolge muss ich
    die Memberfunktionen meiner DBWorker Klasse aufrufen, somit ein Thread entsteht?
    klasse erstellen, init, run?

    Zweite Frage ist: Ist es Sinnvoll, in der ueberschriebenen Methoden, die
    Basisklassenmethode -erst- aufzurufen, bevor ich meine Code ausfuehre
    (siehe DBWorker::InitInstance zb.)?

    Gruss,



  • Irgendwie sieht das komisch aus, denn ich vermisse AfxBeginnThread der den Thread erst mal startet. In deiner Version werden nur die einzelnen Methoden der Klasse angesprungen und das nacheinander, aber kein neuer Thread erzeugt. Schau mal in die FAQ´s unter Thread das wird das erklärt

    Gruß Matthias



  • Hallo Matthias,

    CTecS schrieb:

    Irgendwie sieht das komisch aus, denn ich vermisse AfxBeginnThread der den Thread erst mal startet. .... Schau mal in die FAQ´s unter Thread das wird das erklärt

    Es sieht so aus als ob ich den AfxBeginThread aufrufen muss, damit ich einen Zeiger auf einen CWinThread-Klasse bekomme. Na fein, habe ich auch gemacht. So die Klasse A(db_manager) erzeugt Threads aus Klasse B(db_worker)...

    BOOL DBManager::createWorkers(unsigned int workers){
    
    	DBWorker* worker ;
    
    	for(unsigned int i=0 ; i < workers ; i++){
    		worker = (DBWorker *) AfxBeginThread(RUNTIME_CLASS(DBWorker));
    		// for test purposes ;
    		worker->ResumeThread();
    	}
    
    return TRUE ;
    }
    

    Waere das der richtige Ansatz zur Verwendung der Methode AfxBeginThread wenn
    man Thread Instanzen(nicht Worker Threads) erzeugen will?

    Gruss,



  • Jo, so sieht das auf jeden fall schon mal besser aus. Jetzt kannste weiter Versuchen was de noch machen willst.

    Gruß Matthias


Anmelden zum Antworten