Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Probleme mit Thread und Variabeln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.07.2008, 17:36 Uhr
~HansPeter
Gast


Hallo Leute

Ich programmiere gerade an einer Klasse in einem dialogbasierten VS C++ Programm. Nun benötige ich in dieser Klasse ein Thread, dass auf Variabel zugreifen (lesen/schreiben) kann.

Aber ich bringe es einfach nicht her. :-( Ich weiss nicht, was ich noch falsch mache.

Code-Ausschnitt (letzter Stand):

Header-Datei:

C++:

class CMotorSteuerung : public CWnd
{
// Konstruktion
public:
static UINT myThreadProc(LPVOID lParam);     // Thread Funktion

//…

private:
    bool    m_bThreadReady;        // Thread Status
    bool    m_bOn;            // Motor Status (ON/OFF)
//…

    DECLARE_MESSAGE_MAP()
};




Source Files:

C++:

CMotorSteuerung:: CMotorSteuerung ()
{
    // Grundeinstellungen -> Einschaltstatus
    m_ bThreadReady        = 0;        
    m_ bOn            = 0;    

    // Thread starten -> wird später an einer anderen Stelle gestartet
    AfxBeginThread(AGLThreadProc, this);
}

// Thread Funktion
UINT CMotorSteuerung:: myThreadProc (LPVOID lParam)
{
    while(m_bAGL_On == 1)
    {
        // Verarbeitung
    }

    return 0;   // thread completed successfully
}



Ich hoffe Ihr könnt mir helfen.

Gruss HP
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.07.2008, 17:38 Uhr
~HansPeter
Gast


Ups! Im Aufruf ist die Falsche Funktion.


C++:
AfxBeginThread(myThreadProc , this);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.07.2008, 17:51 Uhr
Tommix



Hallo,

C++:
// Thread Funktion
UINT CMotorSteuerung:: myThreadProc (LPVOID lParam)
{
    CMotorSteuerung* pMotorSteuerung = (CMotorSteuerung*)lParam;

    while(pMotorSteuerung->m_bAGL_On == 1)
    {
        // Verarbeitung
    }

    return 0;   // thread completed successfully
}


Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.07.2008, 08:01 Uhr
~HansPeter
Gast


Vielen Dank Tommix. :-)

Gruss HP
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.07.2008, 18:05 Uhr
~HansPeter
Gast


Hallo Leute, ich bins wieder.

Bin auf ein neues Problem bei meinem Thread gestossen.

Soweit ist eigentlich alles wunderbar gelaufen. Aber nun sollte ich aus meinem Thread auf Funktionen im MainFrm zugreifen können.
Der Compiler meldet keinen Fehler, aber beim ausführen des Programms bekomme ich immer die Meldung:

Unbehandelte Ausnahme im Auto.exe: 0xC0000005: Access Violation.

Kann man im Thread nicht auf MainFrm-Funktionen zugreifen? Oder anders gefragt, was mach ich falsch?

Quellcode:

C++:
// Thread Funktion
UINT CMotorSteuerung:: myThreadProc (LPVOID lParam)
{
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();

    CMotorSteuerung* pMotorSteuerung = (CMotorSteuerung*)lParam;
    
    while(pMotorSteuerung->m_bAGL_On == 1)
    {
        // Verarbeitung

        // Funktion vom MainFrm
        if(pMainFrame->GetStatus())
        {
            // Verarbeitung
        }
    }

    return 0;   // thread completed successfully
}

GetStatus() gibt eine variable zurück, die im MainFrm definiert ist.

Danke für eure Hilfe

Gruss HP
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.07.2008, 23:23 Uhr
mmc20
puss in boots


hi, um nicht bei jedem variablenzugriff über den pointer zuzugreifen hab ich das immer über eine zweite funktion gemacht.

C++:
UINT CMotorSteuerung:: myThreadStart(LPVOID lParam)
{
    CMotorSteuerung* pMotorSteuerung = (CMotorSteuerung*)lParam;
    return ( pMotorSteuerung->myThreadProc() );
}

UINT CMotorSteuerung:: myThreadProc()
{
    UINT uiReturnCode = 0;
    while( m_bAGL_On == 1 )
    {
        // Verarbeitung

        // Funktion vom MainFrm
        if ( pMainFrame->GetStatus() )
        {
            // Verarbeitung
        }
    }
// ...
    return uiReturnCode;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.07.2008, 09:02 Uhr
~HansPeter
Gast


OK, dass mit der zweiten Funktion habe ich auch gemacht. Der Haupteil der Verarbeitung die das Thread macht, löift in einer anderen Funktion, die in myThreadProc() aufgerufen wird.

Aber das Problem mit den MainFrm-Funktionen bleibt ja. :-(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.07.2008, 11:32 Uhr
mmc20
puss in boots


dann teste doch bitte mal ob dein "pMainFrame" zu dem zeitpunkt überhaupt gültig ist.
( evtl. der zugriff auch über "AfxGetMainWnd()->GetStatus()" )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.07.2008, 13:25 Uhr
~HansPeter
Gast


Ich vermute, dass das Problem mit den aufgerufenen von Variabeln im MainFrm zu tun hat. Gebe ich in der 'GetStatus()'einen fixen Wert zurück ('return true') funktioniert der Funktionsaufruf.

mit 'AfxGetMainWnd()->GetStatus();'
meldet der Compiller: error C2039: 'GetStatus' : Ist kein Element von 'CWnd'

Gruss HP
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.07.2008, 01:11 Uhr
mmc20
puss in boots


ja sorry, der gibt dir ein CWnd* das müsste man dann noch casten... aber wenn es funktioniert wenn die funktion einen festen wert zurückgibt, dann mach den rückgabewert doch "const"
Dieser Post wurde am 25.07.2008 um 01:15 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: