Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » thread

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
15.09.2003, 15:00 Uhr
c-mobile



Hey @ll, ich habe ein problem mit einem thread....

ich habe die HauptdialogKlasse nennen wir sie mal
- CHauptDlg

eine weiter Klasse abgeleitet von CObject
- CSockThread
mit einer bestimmten Thread Funktion:

C++:
UINT MyThreadProc( LPVOID pParam )
{
CSockThread* pObject = (CSockThread*)pParam;

if (pObject == NULL ||!pObject->IsKindOf(RUNTIME_CLASS(CSockThread)))
return 1;

// do somethin...  

return 0;    
}




nun hab ich folgenden Threadaufruf (in CHauptDlg):

C++:
pNewObject = new CSockThread;
AfxBeginThread(MyThreadProc, pNewObject);



So siehts aus und nun möchte ich aus meinem Thread (CSockThread)
Funktionen aus der Klasse CHauptDlg aufrufen

das hab ich dann bislang so gemacht

C++:
CHauptDlg* zeiger;
zeiger->funktion();


wobei die Funktion() etwa so aussehen könnte

C++:
void funktion(void)
{
m_editbox = "Nachricht";  
UpdateData(FALSE);
}



Dabei bekomme ich jedoch eine Fehlermeldung bzw der Debugger zeigt eher auf diese Zeile Code (aus wincore.cpp)

C++:
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?


Bitte um Hilfe!

--edit: cpp-tags eingefügt. Nächstes mal selbst machen.

Dieser Post wurde am 16.09.2003 um 14:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.09.2003, 07:37 Uhr
~proga
Gast


Du hast einen Zeiger auf einen Dialog, hast diesen aber nicht initialisiert, oder?
Ich würde die Adresse von dem Hauptdialog dem Thread übergeben und in 'zeiger' speichern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.09.2003, 14:29 Uhr
~c-mobile
Gast


Ja daran könnte es liegen,
aber ich hab gerade mal ausprobiert und da hab ich gemerkt dass zB die MessageBox() Funktion funktioniert.


also wenn ich das hier mache...

C++:
UINT MyThreadProc(LPVOID pParam)
{

CCServerDlg* qObject = new CCServerDlg;
qObject->funktion();
...
}

void funktion(void)
{
MessageBox("blabla");
}


Ich hätte aber gerne wie oben

C++:
void funktion(void)
{
m_editbox = "Nachricht";  
UpdateData(FALSE);
}


Warum geht die MessageBox und das andere nicht ?


Oder wie meinst du das ?!

Dieser Post wurde am 16.09.2003 um 14:31 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.09.2003, 14:33 Uhr
0xdeadbeef
Gott
(Operator)


Du hast weder ein Objekt instanziiert, noch ein Fenster erstellt. Machs so:

C++:
CHauptDlg mein_dialog;
mein_dialog.Create(CHauptDlg::IDD);
mein_dialog.funktion();


Die Messagebox erstellt sich selbst ein Fenster, macht also intern so ziemlich dasselbe.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.09.2003 um 14:33 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.09.2003, 18:32 Uhr
proga



2c-mobile
mit new hast du ja auch eine neue Instanz im Heap erzeugt
mach das mal wie 0xdeadbeef gesagt hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.09.2003, 10:20 Uhr
ao

(Operator)


Moment amal. Ausgangspunkt ist doch eine Instanz von CHauptDlg, in der du einen CSockThread erzeugst, richtig?

Und in der Threadfunktion von diesem willst du Funktionen aus CHauptDlg aufrufen, aber vermutlich keine neue Instanz machen, sondern die "Elterninstanz", die den SockThread erzeugt hat, verwenden, gelle?

Dann mußt du der Threadfunktion nicht nur den CSockThread* (der ja ihr eigenes this ist, übergeben, sondern auch einen Pointer auf CHauptDlg.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.09.2003, 15:28 Uhr
proga




Zitat:
ao postete
Dann mußt du der Threadfunktion nicht nur den CSockThread* (der ja ihr eigenes this ist, übergeben, sondern auch einen Pointer auf CHauptDlg.
ao[/i]
Genau das hab ich ja oben auch gesagt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.09.2003, 15:54 Uhr
ao

(Operator)


Im Hauptdialog:


C++:
CSockThread * pSockThread = new CSockThread;
AfxBeginThread (MyThreadProc, this); // this ist der HauptDlg



Im Thread:


C++:
UINT MyThreadProc (LPVOID pParam)
{
    CHauptDlg * pHauptDlg = (CHauptDlg *) pParam;
    pParam -> funktion ();

    return 0;
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.09.2003, 16:06 Uhr
~c-mobile
Gast


Thx schon mal an alle, bin schon um einiges weiter...

Jetzt funktioniert die Funktion UpdateData() zwar aber erzeugt eine Assert Fehlermeldung


C++:
CObject* p;
        ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
            (p = pMap->LookupTemporary(m_hWnd)) != NULL);
        ASSERT((CWnd*)p == this);   // must be us



 
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: