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