Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Pointerübergabe von CListCtrl in Thread funzt nicht

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
13.12.2004, 08:27 Uhr
~der ralf
Gast


Wenn ich in der Funktion thrRun die Funktion WriteDeviceErrorInTable aufrufe wird m_ListFilterAnalyse nicht richtig übergeben.

C++:
nUINT CPB_ToolView:: Thread(LPVOID pParam)
{
    int* pFlag = (int*) pParam;
    CPB_ToolView* pDlg = (CPB_ToolView*) pParam;
    pDlg->thrRun(pFlag);
    return 0;
}

void CPB_ToolView::thrRun(int* pFlag)
{
HWND hView =((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()->m_hWnd;
        while (*pFlag)  
         {
    if (FilterTitle != "No Filter activated")
           m_FilterOptions.WriteDeviceErrorInTable(m_ListFilterAnalyse);
         }
}



Hier mal die Deklarationen der Funktionen:



C++:
n    void thrRun(int* pFlag);
    static UINT Thread(LPVOID pParam);

    void WriteDeviceErrorInTable(CListCtrl &m_ListFilterAnalyse);



Wenn ich die Funktion außerhalb des Threads aufrufe wird die Adresse des Listenelementes (CListCtrl) korrekt an die Funktion übergeben.
Das ich innerhalb einer Thread-Funktion keine Membervariablen bearbeiten kann ist mir bekannt. Deshalb hab ich ja auch die zusätzliche nicht statische Funktion ThrRun() hinzugefügt aber aus irgendeinem Grund klappt das da auch nicht. Könnt ihr mir helfen woran das liegen könnte?

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.12.2004, 11:18 Uhr
~der ralf
Gast


Ich nochmal.
Wär super wenn mir da einer auf die schnelle helfen könnte. Steh nämlich im Moment so bißchen aufm Schlau und komm nicht weiter bevor das nicht läuft......
Danke.

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.12.2004, 12:13 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Das ich innerhalb einer Thread-Funktion keine Membervariablen bearbeiten kann ist mir bekannt


wie rufst du die threadfunktion auf...

an sonsten müsstest du auf die members zugreifen können wenn du als parameter this mit übergeben hast...


C++:
CPB_ToolView* pDlg = (CPB_ToolView*) pParam;


hier hast du ja schon nen gecasteten pointer... mit pDlg->member müsstest du eigentlich zugriff haben... ich vermute mal das er dein cast nach in nicht mag, weis es aber nich genau hab ich so noch nicht probiert...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 13.12.2004 um 12:14 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.12.2004, 12:47 Uhr
~der ralf
Gast


Ich rufe die Thread - Funktion so auf:

C++:
CWinThread* pThread =AfxBeginThread (Thread, &m_Flag);

Mein Problem ist das beim Aufruf der Funktion :

C++:
m_FilterOptions.WriteDeviceErrorInTable(m_ListFilterAnalyse);

in m_ListFilterAnalyse nix drin steht : ( hWnd=0x00000000); keine Adresse
übergebe ich den Pointer außerhalb der thread - Funktion kennt er die Adresse und übergibt Sie.
Er weiß also in:

C++:
UINT CPB_ToolView:: Thread(LPVOID pParam)

und

C++:
void CPB_ToolView::thrRun(int* pFlag)

mit m_ListFilterAnalyse nix anzufangen. Muß ich mir die Adresse irgenwie nochmal von Hand besorgen?
Alle Funktionen befinden sich übrigens in der View - Klasse des Hauptfensters.

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.12.2004, 13:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm probier mal den aufruf so

C++:
AfxBeginThread(Thread, this);


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.12.2004, 15:13 Uhr
~der ralf
Gast


Habs jetzt anders gelöst. Hab einen globalen Pointer auf das Objekt m_ListFilterAnalyse angelegt dann brauch ich die Addresse nicht mehr beim Aufruf der Funktion übergeben. So kann ich jederzeit die Liste füllen. Trotzdem danke für deine Hilfe.

Gruß
der Ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.12.2004, 15:14 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Habs jetzt anders gelöst. Hab einen globalen Pointer auf das Objekt m_ListFilterAnalyse angelegt


hmm also das ist bestimmt die schlechteste von allen möglichkeiten das zu lösen... globals sind nie ne gute lösung...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.12.2004, 12:30 Uhr
~der ralf
Gast


bin immer offen für bessere Lösungen aber ich versteh nicht warum das am Thread - Aufruf liegen soll. Habe &m_Flag an den Thread übergeben um ihn aus dem Hauptthread heraus starten und stoppen zu können. Wie mach ich das denn dann wenn ich den this-Zeiger übergebe?

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.12.2004, 20:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


na so wie bisher...
wenn du den parameter innerhalb deiner threadfunktion castest kannst du direkt auf die member deines dialoges zugreifen...


C++:
CPB_ToolView* pDlg = (CPB_ToolView*) pParam;
pDlg->...// was auch immer


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.12.2004, 12:42 Uhr
mmc20
puss in boots


hallo, oder du rufst aus der thread-function die eigentliche threadfunktion auf welche member deiner hauptklasse ist

C++:
void CDeinDlg::_StarteThread(int iIndex)
{
    AfxBeginThread(_tThreadFunktion, this);
}

UINT CDeinDlg::_tThreadFunktion(LPVOID pParam)
{
    CDeinDlg* pDlg = (CDeinDlg*)pParam;
    pDlg->_richtigerThread();
    return 0;
}

void CDeinDlg::_richtigerThread()
{
...
// hier kannst dann ganz normal auf alle members der klasse zugreifen
// eventuell musste aber einiges mit CriticalSection's absichern
...
}

 
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: